xref: /aosp_15_r20/external/ksoap2/0001-ksoap2-update.patch (revision 77e5bcce83615128af8f5844790ea39a9bed00b3)
1*77e5bcceSSpandan DasFrom b5b548a4be9f1ced6f5599b62765216f9ab8af00 Mon Sep 17 00:00:00 2001
2*77e5bcceSSpandan DasFrom: Ecco Park <[email protected]>
3*77e5bcceSSpandan DasDate: Tue, 8 May 2018 13:44:14 -0700
4*77e5bcceSSpandan DasSubject: [PATCH 1/1] ksoap2 update
5*77e5bcceSSpandan Das
6*77e5bcceSSpandan DasChange-Id: Iace4c0f3cb31c9532c5fa0c44c2dc863bd81b23e
7*77e5bcceSSpandan DasSigned-off-by: Ecco Park <[email protected]>
8*77e5bcceSSpandan Das---
9*77e5bcceSSpandan Das .../main/java/org/ksoap2/SoapEnvelope.java    |  17 +-
10*77e5bcceSSpandan Das .../src/main/java/org/ksoap2/SoapFault12.java |  13 +-
11*77e5bcceSSpandan Das .../serialization/AttributeContainer.java     | 128 +++++-
12*77e5bcceSSpandan Das .../java/org/ksoap2/serialization/DM.java     |  57 ++-
13*77e5bcceSSpandan Das .../ksoap2/serialization/HasAttributes.java   |  16 +
14*77e5bcceSSpandan Das .../ksoap2/serialization/HasInnerText.java    |  17 +
15*77e5bcceSSpandan Das .../ksoap2/serialization/KvmSerializable.java |  25 +-
16*77e5bcceSSpandan Das .../org/ksoap2/serialization/Marshal.java     |   3 +-
17*77e5bcceSSpandan Das .../ksoap2/serialization/MarshalBase64.java   |   3 +-
18*77e5bcceSSpandan Das .../org/ksoap2/serialization/MarshalDate.java |   3 +-
19*77e5bcceSSpandan Das .../serialization/MarshalHashtable.java       |   8 +-
20*77e5bcceSSpandan Das .../org/ksoap2/serialization/SoapObject.java  | 340 +++++++++++++-
21*77e5bcceSSpandan Das .../ksoap2/serialization/SoapPrimitive.java   |  20 +-
22*77e5bcceSSpandan Das .../SoapSerializationEnvelope.java            | 419 ++++++++++++------
23*77e5bcceSSpandan Das .../org/ksoap2/serialization/ValueWriter.java |  13 +
24*77e5bcceSSpandan Das .../ksoap2/transport/ServiceConnection.java   |  13 +-
25*77e5bcceSSpandan Das .../java/org/ksoap2/transport/Transport.java  | 131 ++++--
26*77e5bcceSSpandan Das .../ksoap2/serialization/MarshalFloat.java    |   3 +-
27*77e5bcceSSpandan Das .../transport/HttpResponseException.java      |  60 +++
28*77e5bcceSSpandan Das .../org/ksoap2/transport/HttpTransportSE.java | 348 +++++++--------
29*77e5bcceSSpandan Das .../transport/HttpsServiceConnectionSE.java   |  58 ++-
30*77e5bcceSSpandan Das .../ksoap2/transport/HttpsTransportSE.java    |  81 ++--
31*77e5bcceSSpandan Das .../transport/KeepAliveHttpsTransportSE.java  |  20 +-
32*77e5bcceSSpandan Das .../ksoap2/transport/ServiceConnectionSE.java |  44 +-
33*77e5bcceSSpandan Das 24 files changed, 1298 insertions(+), 542 deletions(-)
34*77e5bcceSSpandan Das create mode 100644 ksoap2-base/src/main/java/org/ksoap2/serialization/HasAttributes.java
35*77e5bcceSSpandan Das create mode 100644 ksoap2-base/src/main/java/org/ksoap2/serialization/HasInnerText.java
36*77e5bcceSSpandan Das create mode 100644 ksoap2-base/src/main/java/org/ksoap2/serialization/ValueWriter.java
37*77e5bcceSSpandan Das create mode 100644 ksoap2-j2se/src/main/java/org/ksoap2/transport/HttpResponseException.java
38*77e5bcceSSpandan Das
39*77e5bcceSSpandan Dasdiff --git a/ksoap2-base/src/main/java/org/ksoap2/SoapEnvelope.java b/ksoap2-base/src/main/java/org/ksoap2/SoapEnvelope.java
40*77e5bcceSSpandan Dasindex 8a0b894..1c43656 100644
41*77e5bcceSSpandan Das--- a/ksoap2-base/src/main/java/org/ksoap2/SoapEnvelope.java
42*77e5bcceSSpandan Das+++ b/ksoap2-base/src/main/java/org/ksoap2/SoapEnvelope.java
43*77e5bcceSSpandan Das@@ -54,10 +54,8 @@ public class SoapEnvelope {
44*77e5bcceSSpandan Das     /** Namespace constant: http://www.w3.org/1999/XMLSchema */
45*77e5bcceSSpandan Das     public static final String XSI1999 = "http://www.w3.org/1999/XMLSchema-instance";
46*77e5bcceSSpandan Das
47*77e5bcceSSpandan Das-    //public static final String NS20 = "http://www.wi-fi-org/specifications/hotspot2dot0/spp/1.0/";
48*77e5bcceSSpandan Das     public static final String NS20 = "http://www.wi-fi.org/specifications/hotspot2dot0/v1.0/spp";
49*77e5bcceSSpandan Das
50*77e5bcceSSpandan Das-    //public static final String OMADM12 = "http://www.openmobilealliance.org/tech/DTD/dm_ddf-v1_2.dtd";
51*77e5bcceSSpandan Das
52*77e5bcceSSpandan Das     /**
53*77e5bcceSSpandan Das      * Returns true for the string values "1" and "true", ignoring upper/lower
54*77e5bcceSSpandan Das@@ -105,9 +103,8 @@ public class SoapEnvelope {
55*77e5bcceSSpandan Das     /** Xml Schema data namespace, set by the constructor */
56*77e5bcceSSpandan Das     public String xsd;
57*77e5bcceSSpandan Das
58*77e5bcceSSpandan Das-    ///M: HS20 Add by Jungo
59*77e5bcceSSpandan Das+    // HS20 change
60*77e5bcceSSpandan Das     public String ns;
61*77e5bcceSSpandan Das-    public String omadm;
62*77e5bcceSSpandan Das
63*77e5bcceSSpandan Das     /**
64*77e5bcceSSpandan Das      * Initializes a SOAP Envelope. The version parameter must be set to one of
65*77e5bcceSSpandan Das@@ -129,10 +126,8 @@ public class SoapEnvelope {
66*77e5bcceSSpandan Das             enc = SoapEnvelope.ENC2003;
67*77e5bcceSSpandan Das             env = SoapEnvelope.ENV2003;
68*77e5bcceSSpandan Das         }
69*77e5bcceSSpandan Das-
70*77e5bcceSSpandan Das+        // HS20 change
71*77e5bcceSSpandan Das         ns = SoapEnvelope.NS20;
72*77e5bcceSSpandan Das-        //omadm = SoapEnvelope.OMADM12;
73*77e5bcceSSpandan Das-
74*77e5bcceSSpandan Das     }
75*77e5bcceSSpandan Das
76*77e5bcceSSpandan Das     /** Parses the SOAP envelope from the given parser */
77*77e5bcceSSpandan Das@@ -206,13 +201,9 @@ public class SoapEnvelope {
78*77e5bcceSSpandan Das      * given XML writer.
79*77e5bcceSSpandan Das      */
80*77e5bcceSSpandan Das     public void write(XmlSerializer writer) throws IOException {
81*77e5bcceSSpandan Das-        ///M: HS20 modify by Jungo
82*77e5bcceSSpandan Das-        //writer.setPrefix("i", xsi);
83*77e5bcceSSpandan Das-        //writer.setPrefix("d", xsd);
84*77e5bcceSSpandan Das-        //writer.setPrefix("c", enc);
85*77e5bcceSSpandan Das-        writer.setPrefix("soap", env);//the prefix for namespace env in xml output
86*77e5bcceSSpandan Das+        // HS 2.0 changes
87*77e5bcceSSpandan Das+        writer.setPrefix("soap", env); //the prefix for namespace env in xml output
88*77e5bcceSSpandan Das         writer.setPrefix("spp", ns);
89*77e5bcceSSpandan Das-        //writer.setPrefix("omadm", omadm);
90*77e5bcceSSpandan Das
91*77e5bcceSSpandan Das         writer.startTag(env, "Envelope");
92*77e5bcceSSpandan Das         writer.startTag(env, "Header");
93*77e5bcceSSpandan Dasdiff --git a/ksoap2-base/src/main/java/org/ksoap2/SoapFault12.java b/ksoap2-base/src/main/java/org/ksoap2/SoapFault12.java
94*77e5bcceSSpandan Dasindex 5667cb4..3f39147 100644
95*77e5bcceSSpandan Das--- a/ksoap2-base/src/main/java/org/ksoap2/SoapFault12.java
96*77e5bcceSSpandan Das+++ b/ksoap2-base/src/main/java/org/ksoap2/SoapFault12.java
97*77e5bcceSSpandan Das@@ -72,27 +72,28 @@ public class SoapFault12 extends SoapFault {
98*77e5bcceSSpandan Das
99*77e5bcceSSpandan Das         while (parser.nextTag() == XmlPullParser.START_TAG) {
100*77e5bcceSSpandan Das             String name = parser.getName();
101*77e5bcceSSpandan Das+            String namespace = parser.getNamespace();
102*77e5bcceSSpandan Das             parser.nextTag();
103*77e5bcceSSpandan Das-            if (name.equals("Code")) {
104*77e5bcceSSpandan Das+            if (name.toLowerCase().equals("Code".toLowerCase())) {
105*77e5bcceSSpandan Das                 this.Code = new Node();
106*77e5bcceSSpandan Das                 this.Code.parse(parser);
107*77e5bcceSSpandan Das-            } else if (name.equals("Reason")) {
108*77e5bcceSSpandan Das+            } else if (name.toLowerCase().equals("Reason".toLowerCase())) {
109*77e5bcceSSpandan Das                 this.Reason = new Node();
110*77e5bcceSSpandan Das                 this.Reason.parse(parser);
111*77e5bcceSSpandan Das-            } else if (name.equals("Node")) {
112*77e5bcceSSpandan Das+            } else if (name.toLowerCase().equals("Node".toLowerCase())) {
113*77e5bcceSSpandan Das                 this.Node = new Node();
114*77e5bcceSSpandan Das                 this.Node.parse(parser);
115*77e5bcceSSpandan Das-            } else if (name.equals("Role")) {
116*77e5bcceSSpandan Das+            } else if (name.toLowerCase().equals("Role".toLowerCase())) {
117*77e5bcceSSpandan Das                 this.Role = new Node();
118*77e5bcceSSpandan Das                 this.Role.parse(parser);
119*77e5bcceSSpandan Das-            } else if (name.equals("Detail")) {
120*77e5bcceSSpandan Das+            } else if (name.toLowerCase().equals("Detail".toLowerCase())) {
121*77e5bcceSSpandan Das                 this.Detail = new Node();
122*77e5bcceSSpandan Das                 this.Detail.parse(parser);
123*77e5bcceSSpandan Das             } else {
124*77e5bcceSSpandan Das                 throw new RuntimeException("unexpected tag:" + name);
125*77e5bcceSSpandan Das             }
126*77e5bcceSSpandan Das
127*77e5bcceSSpandan Das-            parser.require(XmlPullParser.END_TAG, SoapEnvelope.ENV2003, name);
128*77e5bcceSSpandan Das+            parser.require(XmlPullParser.END_TAG, namespace, name);
129*77e5bcceSSpandan Das         }
130*77e5bcceSSpandan Das         parser.require(XmlPullParser.END_TAG, SoapEnvelope.ENV2003, "Fault");
131*77e5bcceSSpandan Das         parser.nextTag();
132*77e5bcceSSpandan Dasdiff --git a/ksoap2-base/src/main/java/org/ksoap2/serialization/AttributeContainer.java b/ksoap2-base/src/main/java/org/ksoap2/serialization/AttributeContainer.java
133*77e5bcceSSpandan Dasindex 6b83847..34d2723 100644
134*77e5bcceSSpandan Das--- a/ksoap2-base/src/main/java/org/ksoap2/serialization/AttributeContainer.java
135*77e5bcceSSpandan Das+++ b/ksoap2-base/src/main/java/org/ksoap2/serialization/AttributeContainer.java
136*77e5bcceSSpandan Das@@ -3,8 +3,8 @@ package org.ksoap2.serialization;
137*77e5bcceSSpandan Das
138*77e5bcceSSpandan Das import java.util.Vector;
139*77e5bcceSSpandan Das
140*77e5bcceSSpandan Das-public class AttributeContainer {
141*77e5bcceSSpandan Das-    private Vector attributes = new Vector();
142*77e5bcceSSpandan Das+public class AttributeContainer implements HasAttributes{
143*77e5bcceSSpandan Das+    protected Vector attributes = new Vector();
144*77e5bcceSSpandan Das
145*77e5bcceSSpandan Das     /**
146*77e5bcceSSpandan Das      * Places AttributeInfo of desired attribute into a designated AttributeInfo object
147*77e5bcceSSpandan Das@@ -29,9 +29,9 @@ public class AttributeContainer {
148*77e5bcceSSpandan Das         return ((AttributeInfo) attributes.elementAt(index)).getValue();
149*77e5bcceSSpandan Das     }
150*77e5bcceSSpandan Das
151*77e5bcceSSpandan Das-    /**
152*77e5bcceSSpandan Das-    * Get the attribute's toString value.
153*77e5bcceSSpandan Das-    */
154*77e5bcceSSpandan Das+     /**
155*77e5bcceSSpandan Das+     * Get the attribute's toString value.
156*77e5bcceSSpandan Das+     */
157*77e5bcceSSpandan Das     public String getAttributeAsString(int index) {
158*77e5bcceSSpandan Das         AttributeInfo attributeInfo = (AttributeInfo) attributes.elementAt(index);
159*77e5bcceSSpandan Das         return attributeInfo.getValue().toString();
160*77e5bcceSSpandan Das@@ -51,6 +51,20 @@ public class AttributeContainer {
161*77e5bcceSSpandan Das         }
162*77e5bcceSSpandan Das     }
163*77e5bcceSSpandan Das
164*77e5bcceSSpandan Das+    /**
165*77e5bcceSSpandan Das+     * Get the attribute with the given name
166*77e5bcceSSpandan Das+     *
167*77e5bcceSSpandan Das+     * @throws RuntimeException if the attribute does not exist
168*77e5bcceSSpandan Das+     */
169*77e5bcceSSpandan Das+    public Object getAttribute(String namespace,String name) {
170*77e5bcceSSpandan Das+        Integer i = attributeIndex(namespace,name);
171*77e5bcceSSpandan Das+        if (i != null) {
172*77e5bcceSSpandan Das+            return getAttribute(i.intValue());
173*77e5bcceSSpandan Das+        } else {
174*77e5bcceSSpandan Das+            throw new RuntimeException("illegal property: " + name);
175*77e5bcceSSpandan Das+        }
176*77e5bcceSSpandan Das+    }
177*77e5bcceSSpandan Das+
178*77e5bcceSSpandan Das     /**
179*77e5bcceSSpandan Das      * Get the toString value of the attribute with the given name.
180*77e5bcceSSpandan Das      *
181*77e5bcceSSpandan Das@@ -65,6 +79,19 @@ public class AttributeContainer {
182*77e5bcceSSpandan Das         }
183*77e5bcceSSpandan Das     }
184*77e5bcceSSpandan Das
185*77e5bcceSSpandan Das+    /**
186*77e5bcceSSpandan Das+     * Get the toString value of the attribute with the given name.
187*77e5bcceSSpandan Das+     *
188*77e5bcceSSpandan Das+     * @throws RuntimeException if the attribute does not exist
189*77e5bcceSSpandan Das+     */
190*77e5bcceSSpandan Das+    public String getAttributeAsString(String namespace,String name) {
191*77e5bcceSSpandan Das+        Integer i = attributeIndex(namespace,name);
192*77e5bcceSSpandan Das+        if (i != null) {
193*77e5bcceSSpandan Das+            return getAttribute(i.intValue()).toString();
194*77e5bcceSSpandan Das+        } else {
195*77e5bcceSSpandan Das+            throw new RuntimeException("illegal property: " + name);
196*77e5bcceSSpandan Das+        }
197*77e5bcceSSpandan Das+    }
198*77e5bcceSSpandan Das     /**
199*77e5bcceSSpandan Das      * Knows whether the given attribute exists
200*77e5bcceSSpandan Das      */
201*77e5bcceSSpandan Das@@ -76,6 +103,16 @@ public class AttributeContainer {
202*77e5bcceSSpandan Das         }
203*77e5bcceSSpandan Das     }
204*77e5bcceSSpandan Das
205*77e5bcceSSpandan Das+    /**
206*77e5bcceSSpandan Das+     * Knows whether the given attribute exists
207*77e5bcceSSpandan Das+     */
208*77e5bcceSSpandan Das+    public boolean hasAttribute(final String namespace,final String name) {
209*77e5bcceSSpandan Das+        if (attributeIndex(namespace,name) != null) {
210*77e5bcceSSpandan Das+            return true;
211*77e5bcceSSpandan Das+        } else {
212*77e5bcceSSpandan Das+            return false;
213*77e5bcceSSpandan Das+        }
214*77e5bcceSSpandan Das+    }
215*77e5bcceSSpandan Das     /**
216*77e5bcceSSpandan Das      * Get an attribute without chance of throwing an exception
217*77e5bcceSSpandan Das      *
218*77e5bcceSSpandan Das@@ -91,6 +128,21 @@ public class AttributeContainer {
219*77e5bcceSSpandan Das         }
220*77e5bcceSSpandan Das     }
221*77e5bcceSSpandan Das
222*77e5bcceSSpandan Das+    /**
223*77e5bcceSSpandan Das+     * Get an attribute without chance of throwing an exception
224*77e5bcceSSpandan Das+     *
225*77e5bcceSSpandan Das+     * @param name the name of the attribute to retrieve
226*77e5bcceSSpandan Das+     * @return the value of the attribute if it exists; {@code null} if it does not exist
227*77e5bcceSSpandan Das+     */
228*77e5bcceSSpandan Das+    public Object getAttributeSafely(String namespace,String name) {
229*77e5bcceSSpandan Das+        Integer i = attributeIndex(namespace,name);
230*77e5bcceSSpandan Das+        if (i != null) {
231*77e5bcceSSpandan Das+            return getAttribute(i.intValue());
232*77e5bcceSSpandan Das+        } else {
233*77e5bcceSSpandan Das+            return null;
234*77e5bcceSSpandan Das+        }
235*77e5bcceSSpandan Das+    }
236*77e5bcceSSpandan Das+
237*77e5bcceSSpandan Das     /**
238*77e5bcceSSpandan Das      * Get an attributes' toString value without chance of throwing an
239*77e5bcceSSpandan Das      * exception.
240*77e5bcceSSpandan Das@@ -108,6 +160,23 @@ public class AttributeContainer {
241*77e5bcceSSpandan Das         }
242*77e5bcceSSpandan Das     }
243*77e5bcceSSpandan Das
244*77e5bcceSSpandan Das+    /**
245*77e5bcceSSpandan Das+     * Get an attributes' toString value without chance of throwing an
246*77e5bcceSSpandan Das+     * exception.
247*77e5bcceSSpandan Das+
248*77e5bcceSSpandan Das+     * @param name
249*77e5bcceSSpandan Das+     * @return the value of the attribute,s toString method if it exists; ""
250*77e5bcceSSpandan Das+     * if it does not exist
251*77e5bcceSSpandan Das+     */
252*77e5bcceSSpandan Das+    public Object getAttributeSafelyAsString(String namespace,String name) {
253*77e5bcceSSpandan Das+        Integer i = attributeIndex(namespace,name);
254*77e5bcceSSpandan Das+        if (i != null) {
255*77e5bcceSSpandan Das+            return getAttribute(i.intValue()).toString();
256*77e5bcceSSpandan Das+        } else {
257*77e5bcceSSpandan Das+            return "";
258*77e5bcceSSpandan Das+        }
259*77e5bcceSSpandan Das+    }
260*77e5bcceSSpandan Das+
261*77e5bcceSSpandan Das     private Integer attributeIndex(String name) {
262*77e5bcceSSpandan Das         for (int i = 0; i < attributes.size(); i++) {
263*77e5bcceSSpandan Das             if (name.equals(((AttributeInfo) attributes.elementAt(i)).getName())) {
264*77e5bcceSSpandan Das@@ -117,6 +186,16 @@ public class AttributeContainer {
265*77e5bcceSSpandan Das         return null;
266*77e5bcceSSpandan Das     }
267*77e5bcceSSpandan Das
268*77e5bcceSSpandan Das+    private Integer attributeIndex(String namespace,String name) {
269*77e5bcceSSpandan Das+        for (int i = 0; i < attributes.size(); i++) {
270*77e5bcceSSpandan Das+            AttributeInfo attrInfo=(AttributeInfo) attributes.elementAt(i);
271*77e5bcceSSpandan Das+            if (name.equals(attrInfo.getName()) && namespace.equals(attrInfo.getNamespace())) {
272*77e5bcceSSpandan Das+                return new Integer(i);
273*77e5bcceSSpandan Das+            }
274*77e5bcceSSpandan Das+        }
275*77e5bcceSSpandan Das+        return null;
276*77e5bcceSSpandan Das+    }
277*77e5bcceSSpandan Das+
278*77e5bcceSSpandan Das     /**
279*77e5bcceSSpandan Das      * Returns the number of attributes
280*77e5bcceSSpandan Das      *
281*77e5bcceSSpandan Das@@ -160,13 +239,25 @@ public class AttributeContainer {
282*77e5bcceSSpandan Das      * @return {@code this} object.
283*77e5bcceSSpandan Das      */
284*77e5bcceSSpandan Das     public void addAttribute(String name, Object value) {
285*77e5bcceSSpandan Das+        addAttribute(null,name,value);
286*77e5bcceSSpandan Das+    }
287*77e5bcceSSpandan Das+
288*77e5bcceSSpandan Das+    /**
289*77e5bcceSSpandan Das+     * Adds a attribute (parameter) to the object.
290*77e5bcceSSpandan Das+     *
291*77e5bcceSSpandan Das+     * @param namespace  The namespace of the attribute
292*77e5bcceSSpandan Das+     * @param name  The name of the attribute
293*77e5bcceSSpandan Das+     * @param value the value of the attribute
294*77e5bcceSSpandan Das+     * @return {@code this} object.
295*77e5bcceSSpandan Das+     */
296*77e5bcceSSpandan Das+    public void addAttribute(String namespace,String name, Object value) {
297*77e5bcceSSpandan Das         AttributeInfo attributeInfo = new AttributeInfo();
298*77e5bcceSSpandan Das         attributeInfo.name = name;
299*77e5bcceSSpandan Das+        attributeInfo.namespace = namespace;
300*77e5bcceSSpandan Das         attributeInfo.type = value == null ? PropertyInfo.OBJECT_CLASS : value.getClass();
301*77e5bcceSSpandan Das         attributeInfo.value = value;
302*77e5bcceSSpandan Das         addAttribute(attributeInfo);
303*77e5bcceSSpandan Das     }
304*77e5bcceSSpandan Das-
305*77e5bcceSSpandan Das     /**
306*77e5bcceSSpandan Das      * Add an attribute if the value is not null.
307*77e5bcceSSpandan Das      * @param name
308*77e5bcceSSpandan Das@@ -178,6 +269,18 @@ public class AttributeContainer {
309*77e5bcceSSpandan Das         }
310*77e5bcceSSpandan Das     }
311*77e5bcceSSpandan Das
312*77e5bcceSSpandan Das+    /**
313*77e5bcceSSpandan Das+     * Add an attribute if the value is not null.
314*77e5bcceSSpandan Das+     * @param namespace  The namespace of the attribute
315*77e5bcceSSpandan Das+     * @param name
316*77e5bcceSSpandan Das+     * @param value
317*77e5bcceSSpandan Das+     */
318*77e5bcceSSpandan Das+    public void addAttributeIfValue(String namespace,String name, Object value) {
319*77e5bcceSSpandan Das+        if (value != null) {
320*77e5bcceSSpandan Das+            addAttribute(namespace,name, value);
321*77e5bcceSSpandan Das+        }
322*77e5bcceSSpandan Das+    }
323*77e5bcceSSpandan Das+
324*77e5bcceSSpandan Das     /**
325*77e5bcceSSpandan Das      * Add a new attribute by providing an {@link AttributeInfo} object.  {@code AttributeInfo}
326*77e5bcceSSpandan Das      * contains all data about the attribute, including name and value.}
327*77e5bcceSSpandan Das@@ -198,4 +301,17 @@ public class AttributeContainer {
328*77e5bcceSSpandan Das             attributes.addElement(attributeInfo);
329*77e5bcceSSpandan Das         }
330*77e5bcceSSpandan Das     }
331*77e5bcceSSpandan Das+
332*77e5bcceSSpandan Das+
333*77e5bcceSSpandan Das+    public void setAttribute(AttributeInfo info) {
334*77e5bcceSSpandan Das+
335*77e5bcceSSpandan Das+
336*77e5bcceSSpandan Das+    }
337*77e5bcceSSpandan Das+
338*77e5bcceSSpandan Das+
339*77e5bcceSSpandan Das+    public void getAttribute(int index, AttributeInfo info) {
340*77e5bcceSSpandan Das+
341*77e5bcceSSpandan Das+
342*77e5bcceSSpandan Das+    }
343*77e5bcceSSpandan Das+
344*77e5bcceSSpandan Das }
345*77e5bcceSSpandan Dasdiff --git a/ksoap2-base/src/main/java/org/ksoap2/serialization/DM.java b/ksoap2-base/src/main/java/org/ksoap2/serialization/DM.java
346*77e5bcceSSpandan Dasindex 78d4449..255126e 100644
347*77e5bcceSSpandan Das--- a/ksoap2-base/src/main/java/org/ksoap2/serialization/DM.java
348*77e5bcceSSpandan Das+++ b/ksoap2-base/src/main/java/org/ksoap2/serialization/DM.java
349*77e5bcceSSpandan Das@@ -20,9 +20,12 @@
350*77e5bcceSSpandan Das
351*77e5bcceSSpandan Das package org.ksoap2.serialization;
352*77e5bcceSSpandan Das
353*77e5bcceSSpandan Das-import java.io.*;
354*77e5bcceSSpandan Das-import org.xmlpull.v1.*;
355*77e5bcceSSpandan Das-import org.ksoap2.*;
356*77e5bcceSSpandan Das+import java.io.IOException;
357*77e5bcceSSpandan Das+
358*77e5bcceSSpandan Das+import org.ksoap2.SoapEnvelope;
359*77e5bcceSSpandan Das+import org.xmlpull.v1.XmlPullParser;
360*77e5bcceSSpandan Das+import org.xmlpull.v1.XmlPullParserException;
361*77e5bcceSSpandan Das+import org.xmlpull.v1.XmlSerializer;
362*77e5bcceSSpandan Das
363*77e5bcceSSpandan Das /**
364*77e5bcceSSpandan Das  * This class is not public, so save a few bytes by using a short class name (DM
365*77e5bcceSSpandan Das@@ -30,8 +33,7 @@ import org.ksoap2.*;
366*77e5bcceSSpandan Das  */
367*77e5bcceSSpandan Das class DM implements Marshal {
368*77e5bcceSSpandan Das
369*77e5bcceSSpandan Das-    public Object readInstance(XmlPullParser parser, String namespace, String name,
370*77e5bcceSSpandan Das-            PropertyInfo expected)
371*77e5bcceSSpandan Das+    public Object readInstance(XmlPullParser parser, String namespace, String name, PropertyInfo excepted)
372*77e5bcceSSpandan Das             throws IOException, XmlPullParserException {
373*77e5bcceSSpandan Das         String text = parser.nextText();
374*77e5bcceSSpandan Das         switch (name.charAt(0)) {
375*77e5bcceSSpandan Das@@ -49,9 +51,10 @@ class DM implements Marshal {
376*77e5bcceSSpandan Das     }
377*77e5bcceSSpandan Das
378*77e5bcceSSpandan Das     /**
379*77e5bcceSSpandan Das-     * Write the instance out. In case it is an AttributeContainer write those our first though.
380*77e5bcceSSpandan Das-     * @param writer
381*77e5bcceSSpandan Das-     *            the xml serializer.
382*77e5bcceSSpandan Das+     * Write the instance out. In case it is an AttributeContainer write those our first though.
383*77e5bcceSSpandan Das+     * If it HasAttributes then write the attributes and values.
384*77e5bcceSSpandan Das+     *
385*77e5bcceSSpandan Das+     * @param writer   the xml serializer.
386*77e5bcceSSpandan Das      * @param instance
387*77e5bcceSSpandan Das      * @throws IOException
388*77e5bcceSSpandan Das      */
389*77e5bcceSSpandan Das@@ -62,11 +65,43 @@ class DM implements Marshal {
390*77e5bcceSSpandan Das             for (int counter = 0; counter < cnt; counter++) {
391*77e5bcceSSpandan Das                 AttributeInfo attributeInfo = new AttributeInfo();
392*77e5bcceSSpandan Das                 attributeContainer.getAttributeInfo(counter, attributeInfo);
393*77e5bcceSSpandan Das-                writer.attribute(attributeInfo.getNamespace(), attributeInfo.getName(),
394*77e5bcceSSpandan Das-                        attributeInfo.getValue().toString());
395*77e5bcceSSpandan Das+                try {
396*77e5bcceSSpandan Das+                    attributeContainer.getAttribute(counter, attributeInfo);
397*77e5bcceSSpandan Das+                } catch (Exception e) {
398*77e5bcceSSpandan Das+                    e.printStackTrace();
399*77e5bcceSSpandan Das+                }
400*77e5bcceSSpandan Das+                if (attributeInfo.getValue() != null) {
401*77e5bcceSSpandan Das+                    writer.attribute(attributeInfo.getNamespace(), attributeInfo.getName(),
402*77e5bcceSSpandan Das+                            (attributeInfo.getValue() != null) ? attributeInfo.getValue().toString() : "");
403*77e5bcceSSpandan Das+                }
404*77e5bcceSSpandan Das+            }
405*77e5bcceSSpandan Das+        } else if (instance instanceof HasAttributes) {
406*77e5bcceSSpandan Das+            HasAttributes soapObject = (HasAttributes) instance;
407*77e5bcceSSpandan Das+            int cnt = soapObject.getAttributeCount();
408*77e5bcceSSpandan Das+            for (int counter = 0; counter < cnt; counter++) {
409*77e5bcceSSpandan Das+                AttributeInfo attributeInfo = new AttributeInfo();
410*77e5bcceSSpandan Das+                soapObject.getAttributeInfo(counter, attributeInfo);
411*77e5bcceSSpandan Das+                try {
412*77e5bcceSSpandan Das+                    soapObject.getAttribute(counter, attributeInfo);
413*77e5bcceSSpandan Das+                } catch (Exception e) {
414*77e5bcceSSpandan Das+                    e.printStackTrace();
415*77e5bcceSSpandan Das+                }
416*77e5bcceSSpandan Das+                if (attributeInfo.getValue() != null) {
417*77e5bcceSSpandan Das+                    writer.attribute(attributeInfo.getNamespace(), attributeInfo.getName(),
418*77e5bcceSSpandan Das+                            attributeInfo.getValue() != null ? attributeInfo.getValue().toString() : "");
419*77e5bcceSSpandan Das+                }
420*77e5bcceSSpandan Das             }
421*77e5bcceSSpandan Das         }
422*77e5bcceSSpandan Das-        writer.text(instance.toString());
423*77e5bcceSSpandan Das+
424*77e5bcceSSpandan Das+        if(instance  instanceof ValueWriter)
425*77e5bcceSSpandan Das+        {
426*77e5bcceSSpandan Das+            ((ValueWriter)instance).write(writer);
427*77e5bcceSSpandan Das+        }
428*77e5bcceSSpandan Das+        else
429*77e5bcceSSpandan Das+        {
430*77e5bcceSSpandan Das+            writer.text(instance.toString());
431*77e5bcceSSpandan Das+        }
432*77e5bcceSSpandan Das+
433*77e5bcceSSpandan Das     }
434*77e5bcceSSpandan Das
435*77e5bcceSSpandan Das     public void register(SoapSerializationEnvelope cm) {
436*77e5bcceSSpandan Dasdiff --git a/ksoap2-base/src/main/java/org/ksoap2/serialization/HasAttributes.java b/ksoap2-base/src/main/java/org/ksoap2/serialization/HasAttributes.java
437*77e5bcceSSpandan Dasnew file mode 100644
438*77e5bcceSSpandan Dasindex 0000000..b513138
439*77e5bcceSSpandan Das--- /dev/null
440*77e5bcceSSpandan Das+++ b/ksoap2-base/src/main/java/org/ksoap2/serialization/HasAttributes.java
441*77e5bcceSSpandan Das@@ -0,0 +1,16 @@
442*77e5bcceSSpandan Das+package org.ksoap2.serialization;
443*77e5bcceSSpandan Das+
444*77e5bcceSSpandan Das+/**
445*77e5bcceSSpandan Das+ * Common inteface for classes which want to serialize attributes to outgoing soap message
446*77e5bcceSSpandan Das+ *
447*77e5bcceSSpandan Das+ * @author robocik
448*77e5bcceSSpandan Das+ */
449*77e5bcceSSpandan Das+public interface HasAttributes {
450*77e5bcceSSpandan Das+    int getAttributeCount();
451*77e5bcceSSpandan Das+
452*77e5bcceSSpandan Das+    void getAttributeInfo(int index, AttributeInfo info);
453*77e5bcceSSpandan Das+
454*77e5bcceSSpandan Das+    void getAttribute(int index, AttributeInfo info);
455*77e5bcceSSpandan Das+
456*77e5bcceSSpandan Das+    void setAttribute(AttributeInfo info);
457*77e5bcceSSpandan Das+}
458*77e5bcceSSpandan Dasdiff --git a/ksoap2-base/src/main/java/org/ksoap2/serialization/HasInnerText.java b/ksoap2-base/src/main/java/org/ksoap2/serialization/HasInnerText.java
459*77e5bcceSSpandan Dasnew file mode 100644
460*77e5bcceSSpandan Dasindex 0000000..b35c35b
461*77e5bcceSSpandan Das--- /dev/null
462*77e5bcceSSpandan Das+++ b/ksoap2-base/src/main/java/org/ksoap2/serialization/HasInnerText.java
463*77e5bcceSSpandan Das@@ -0,0 +1,17 @@
464*77e5bcceSSpandan Das+package org.ksoap2.serialization;
465*77e5bcceSSpandan Das+/**
466*77e5bcceSSpandan Das+ * Interface for classes requiring inner text of xml  tags
467*77e5bcceSSpandan Das+ *
468*77e5bcceSSpandan Das+ * @author satansly
469*77e5bcceSSpandan Das+ */
470*77e5bcceSSpandan Das+public interface HasInnerText {
471*77e5bcceSSpandan Das+     /**
472*77e5bcceSSpandan Das+     * Gets the inner text of xml tags
473*77e5bcceSSpandan Das+     */
474*77e5bcceSSpandan Das+    Object getInnerText();
475*77e5bcceSSpandan Das+
476*77e5bcceSSpandan Das+    /**
477*77e5bcceSSpandan Das+     * @param s String to be set as inner text for an outgoing soap object
478*77e5bcceSSpandan Das+     */
479*77e5bcceSSpandan Das+    void setInnerText(Object s);
480*77e5bcceSSpandan Das+}
481*77e5bcceSSpandan Dasdiff --git a/ksoap2-base/src/main/java/org/ksoap2/serialization/KvmSerializable.java b/ksoap2-base/src/main/java/org/ksoap2/serialization/KvmSerializable.java
482*77e5bcceSSpandan Dasindex bded0c0..09d7b32 100644
483*77e5bcceSSpandan Das--- a/ksoap2-base/src/main/java/org/ksoap2/serialization/KvmSerializable.java
484*77e5bcceSSpandan Das+++ b/ksoap2-base/src/main/java/org/ksoap2/serialization/KvmSerializable.java
485*77e5bcceSSpandan Das@@ -39,31 +39,26 @@ public interface KvmSerializable {
486*77e5bcceSSpandan Das      */
487*77e5bcceSSpandan Das     Object getProperty(int index);
488*77e5bcceSSpandan Das
489*77e5bcceSSpandan Das-    /**
490*77e5bcceSSpandan Das-     * @return the number of serializable properties
491*77e5bcceSSpandan Das+    /**
492*77e5bcceSSpandan Das+     * @return the number of serializable properties
493*77e5bcceSSpandan Das      */
494*77e5bcceSSpandan Das     int getPropertyCount();
495*77e5bcceSSpandan Das
496*77e5bcceSSpandan Das     /**
497*77e5bcceSSpandan Das      * Sets the property with the given index to the given value.
498*77e5bcceSSpandan Das-     *
499*77e5bcceSSpandan Das-     * @param index
500*77e5bcceSSpandan Das-     *            the index to be set
501*77e5bcceSSpandan Das-     * @param value
502*77e5bcceSSpandan Das-     *            the value of the property
503*77e5bcceSSpandan Das+     *
504*77e5bcceSSpandan Das+     * @param index the index to be set
505*77e5bcceSSpandan Das+     * @param value the value of the property
506*77e5bcceSSpandan Das      */
507*77e5bcceSSpandan Das     void setProperty(int index, Object value);
508*77e5bcceSSpandan Das
509*77e5bcceSSpandan Das     /**
510*77e5bcceSSpandan Das      * Fills the given property info record.
511*77e5bcceSSpandan Das-     *
512*77e5bcceSSpandan Das-     * @param index
513*77e5bcceSSpandan Das-     *            the index to be queried
514*77e5bcceSSpandan Das-     * @param properties
515*77e5bcceSSpandan Das-     *            information about the (de)serializer.  Not frequently used.
516*77e5bcceSSpandan Das-     * @param info
517*77e5bcceSSpandan Das-     *            The return parameter, to be filled with information about the
518*77e5bcceSSpandan Das-     *            property with the given index.
519*77e5bcceSSpandan Das+     *
520*77e5bcceSSpandan Das+     * @param index      the index to be queried
521*77e5bcceSSpandan Das+     * @param properties information about the (de)serializer.  Not frequently used.
522*77e5bcceSSpandan Das+     * @param info       The return parameter, to be filled with information about the
523*77e5bcceSSpandan Das+     *                   property with the given index.
524*77e5bcceSSpandan Das      */
525*77e5bcceSSpandan Das     void getPropertyInfo(int index, Hashtable properties, PropertyInfo info);
526*77e5bcceSSpandan Das
527*77e5bcceSSpandan Dasdiff --git a/ksoap2-base/src/main/java/org/ksoap2/serialization/Marshal.java b/ksoap2-base/src/main/java/org/ksoap2/serialization/Marshal.java
528*77e5bcceSSpandan Dasindex cfa9d81..100f107 100644
529*77e5bcceSSpandan Das--- a/ksoap2-base/src/main/java/org/ksoap2/serialization/Marshal.java
530*77e5bcceSSpandan Das+++ b/ksoap2-base/src/main/java/org/ksoap2/serialization/Marshal.java
531*77e5bcceSSpandan Das@@ -41,8 +41,7 @@ public interface Marshal {
532*77e5bcceSSpandan Das      *            the namespace.
533*77e5bcceSSpandan Das      * @return the object read from the xml stream.
534*77e5bcceSSpandan Das      */
535*77e5bcceSSpandan Das-    public Object readInstance(XmlPullParser parser, String namespace, String name,
536*77e5bcceSSpandan Das-            PropertyInfo expected)
537*77e5bcceSSpandan Das+    public Object readInstance(XmlPullParser parser, String namespace, String name, PropertyInfo expected)
538*77e5bcceSSpandan Das             throws IOException, XmlPullParserException;
539*77e5bcceSSpandan Das
540*77e5bcceSSpandan Das     /**
541*77e5bcceSSpandan Dasdiff --git a/ksoap2-base/src/main/java/org/ksoap2/serialization/MarshalBase64.java b/ksoap2-base/src/main/java/org/ksoap2/serialization/MarshalBase64.java
542*77e5bcceSSpandan Dasindex 2f8420c..2239027 100644
543*77e5bcceSSpandan Das--- a/ksoap2-base/src/main/java/org/ksoap2/serialization/MarshalBase64.java
544*77e5bcceSSpandan Das+++ b/ksoap2-base/src/main/java/org/ksoap2/serialization/MarshalBase64.java
545*77e5bcceSSpandan Das@@ -31,8 +31,7 @@ import org.xmlpull.v1.*;
546*77e5bcceSSpandan Das public class MarshalBase64 implements Marshal {
547*77e5bcceSSpandan Das     public static Class BYTE_ARRAY_CLASS = new byte[0].getClass();
548*77e5bcceSSpandan Das
549*77e5bcceSSpandan Das-    public Object readInstance(XmlPullParser parser, String namespace, String name,
550*77e5bcceSSpandan Das-            PropertyInfo expected)
551*77e5bcceSSpandan Das+    public Object readInstance(XmlPullParser parser, String namespace, String name, PropertyInfo expected)
552*77e5bcceSSpandan Das             throws IOException, XmlPullParserException {
553*77e5bcceSSpandan Das         return Base64.decode(parser.nextText());
554*77e5bcceSSpandan Das     }
555*77e5bcceSSpandan Dasdiff --git a/ksoap2-base/src/main/java/org/ksoap2/serialization/MarshalDate.java b/ksoap2-base/src/main/java/org/ksoap2/serialization/MarshalDate.java
556*77e5bcceSSpandan Dasindex 3e4fa06..489ba3b 100644
557*77e5bcceSSpandan Das--- a/ksoap2-base/src/main/java/org/ksoap2/serialization/MarshalDate.java
558*77e5bcceSSpandan Das+++ b/ksoap2-base/src/main/java/org/ksoap2/serialization/MarshalDate.java
559*77e5bcceSSpandan Das@@ -31,8 +31,7 @@ import org.ksoap2.kobjects.isodate.*;
560*77e5bcceSSpandan Das public class MarshalDate implements Marshal {
561*77e5bcceSSpandan Das     public static Class DATE_CLASS = new Date().getClass();
562*77e5bcceSSpandan Das
563*77e5bcceSSpandan Das-    public Object readInstance(XmlPullParser parser, String namespace, String name,
564*77e5bcceSSpandan Das-            PropertyInfo expected)
565*77e5bcceSSpandan Das+    public Object readInstance(XmlPullParser parser, String namespace, String name, PropertyInfo expected)
566*77e5bcceSSpandan Das             throws IOException, XmlPullParserException {
567*77e5bcceSSpandan Das         return IsoDate.stringToDate(parser.nextText(), IsoDate.DATE_TIME);
568*77e5bcceSSpandan Das     }
569*77e5bcceSSpandan Dasdiff --git a/ksoap2-base/src/main/java/org/ksoap2/serialization/MarshalHashtable.java b/ksoap2-base/src/main/java/org/ksoap2/serialization/MarshalHashtable.java
570*77e5bcceSSpandan Dasindex d2367e9..0c6b53e 100644
571*77e5bcceSSpandan Das--- a/ksoap2-base/src/main/java/org/ksoap2/serialization/MarshalHashtable.java
572*77e5bcceSSpandan Das+++ b/ksoap2-base/src/main/java/org/ksoap2/serialization/MarshalHashtable.java
573*77e5bcceSSpandan Das@@ -46,8 +46,7 @@ public class MarshalHashtable implements Marshal {
574*77e5bcceSSpandan Das     public static final Class HASHTABLE_CLASS = new Hashtable().getClass();
575*77e5bcceSSpandan Das     SoapSerializationEnvelope envelope;
576*77e5bcceSSpandan Das
577*77e5bcceSSpandan Das-    public Object readInstance(XmlPullParser parser, String namespace, String name,
578*77e5bcceSSpandan Das-            PropertyInfo expected)
579*77e5bcceSSpandan Das+    public Object readInstance(XmlPullParser parser, String namespace, String name, PropertyInfo expected)
580*77e5bcceSSpandan Das             throws IOException, XmlPullParserException {
581*77e5bcceSSpandan Das         Hashtable instance = new Hashtable();
582*77e5bcceSSpandan Das         String elementName = parser.getName();
583*77e5bcceSSpandan Das@@ -81,7 +80,7 @@ public class MarshalHashtable implements Marshal {
584*77e5bcceSSpandan Das             Object key = keys.nextElement();
585*77e5bcceSSpandan Das             item.setProperty(0, key);
586*77e5bcceSSpandan Das             item.setProperty(1, h.get(key));
587*77e5bcceSSpandan Das-            envelope.writeObjectBody(writer, item);
588*77e5bcceSSpandan Das+            envelope.writeObjectBodyWithAttributes(writer, item);
589*77e5bcceSSpandan Das             writer.endTag("", "item");
590*77e5bcceSSpandan Das         }
591*77e5bcceSSpandan Das     }
592*77e5bcceSSpandan Das@@ -89,7 +88,6 @@ public class MarshalHashtable implements Marshal {
593*77e5bcceSSpandan Das     class ItemSoapObject extends SoapObject {
594*77e5bcceSSpandan Das         Hashtable h;
595*77e5bcceSSpandan Das         int resolvedIndex = -1;
596*77e5bcceSSpandan Das-
597*77e5bcceSSpandan Das         ItemSoapObject(Hashtable h) {
598*77e5bcceSSpandan Das             super(null, null);
599*77e5bcceSSpandan Das             this.h = h;
600*77e5bcceSSpandan Das@@ -107,7 +105,7 @@ public class MarshalHashtable implements Marshal {
601*77e5bcceSSpandan Das                 Object resolved = resolvedIndex == 0 ? getProperty(0) : getProperty(1);
602*77e5bcceSSpandan Das                 if (index == 0) {
603*77e5bcceSSpandan Das                     h.put(value, resolved);
604*77e5bcceSSpandan Das-                } else {
605*77e5bcceSSpandan Das+                } else  {
606*77e5bcceSSpandan Das                     h.put(resolved, value);
607*77e5bcceSSpandan Das                 }
608*77e5bcceSSpandan Das             }
609*77e5bcceSSpandan Dasdiff --git a/ksoap2-base/src/main/java/org/ksoap2/serialization/SoapObject.java b/ksoap2-base/src/main/java/org/ksoap2/serialization/SoapObject.java
610*77e5bcceSSpandan Dasindex 24a1ffe..f11210a 100644
611*77e5bcceSSpandan Das--- a/ksoap2-base/src/main/java/org/ksoap2/serialization/SoapObject.java
612*77e5bcceSSpandan Das+++ b/ksoap2-base/src/main/java/org/ksoap2/serialization/SoapObject.java
613*77e5bcceSSpandan Das@@ -38,7 +38,7 @@ import java.util.*;
614*77e5bcceSSpandan Das  * KvmSerializable interface.
615*77e5bcceSSpandan Das  */
616*77e5bcceSSpandan Das
617*77e5bcceSSpandan Das-public class SoapObject extends AttributeContainer implements KvmSerializable {
618*77e5bcceSSpandan Das+public class SoapObject extends AttributeContainer implements KvmSerializable, HasInnerText {
619*77e5bcceSSpandan Das
620*77e5bcceSSpandan Das     private static final String EMPTY_STRING = "";
621*77e5bcceSSpandan Das     /**
622*77e5bcceSSpandan Das@@ -54,6 +54,8 @@ public class SoapObject extends AttributeContainer implements KvmSerializable {
623*77e5bcceSSpandan Das      */
624*77e5bcceSSpandan Das     protected Vector properties = new Vector();
625*77e5bcceSSpandan Das
626*77e5bcceSSpandan Das+    protected Object innerText;
627*77e5bcceSSpandan Das+
628*77e5bcceSSpandan Das     // TODO: accessing properties and attributes would work much better if we
629*77e5bcceSSpandan Das     // kept a list of known properties instead of iterating through the list
630*77e5bcceSSpandan Das     // each time
631*77e5bcceSSpandan Das@@ -181,6 +183,230 @@ public class SoapObject extends AttributeContainer implements KvmSerializable {
632*77e5bcceSSpandan Das         }
633*77e5bcceSSpandan Das     }
634*77e5bcceSSpandan Das
635*77e5bcceSSpandan Das+    /**
636*77e5bcceSSpandan Das+     * Get the property with the given name
637*77e5bcceSSpandan Das+     *
638*77e5bcceSSpandan Das+     * return null
639*77e5bcceSSpandan Das+     *             if the property does not exist
640*77e5bcceSSpandan Das+     */
641*77e5bcceSSpandan Das+    public Object getProperty(String namespace,String name) {
642*77e5bcceSSpandan Das+        Integer index = propertyIndex(namespace,name);
643*77e5bcceSSpandan Das+        if (index != null) {
644*77e5bcceSSpandan Das+            return getProperty(index.intValue());
645*77e5bcceSSpandan Das+        }
646*77e5bcceSSpandan Das+        else {
647*77e5bcceSSpandan Das+            throw new RuntimeException("illegal property: " + name);
648*77e5bcceSSpandan Das+        }
649*77e5bcceSSpandan Das+    }
650*77e5bcceSSpandan Das+
651*77e5bcceSSpandan Das+    /**
652*77e5bcceSSpandan Das+     * Get a property using namespace and name without chance of throwing an exception
653*77e5bcceSSpandan Das+     *
654*77e5bcceSSpandan Das+     * @return the property if it exists; if not, {@link NullSoapObject} is
655*77e5bcceSSpandan Das+     *         returned
656*77e5bcceSSpandan Das+     */
657*77e5bcceSSpandan Das+    public Object getPropertyByNamespaceSafely(final String namespace, final String name) {
658*77e5bcceSSpandan Das+        Integer i = propertyIndex(namespace,name);
659*77e5bcceSSpandan Das+        if (i != null) {
660*77e5bcceSSpandan Das+            return getProperty(i.intValue());
661*77e5bcceSSpandan Das+        } else {
662*77e5bcceSSpandan Das+            return new NullSoapObject();
663*77e5bcceSSpandan Das+        }
664*77e5bcceSSpandan Das+    }
665*77e5bcceSSpandan Das+
666*77e5bcceSSpandan Das+    /**
667*77e5bcceSSpandan Das+     * Get the toString value of a property without chance of throwing an
668*77e5bcceSSpandan Das+     * exception
669*77e5bcceSSpandan Das+     *
670*77e5bcceSSpandan Das+     * @return the string value of the property if it exists; if not, #EMPTY_STRING is
671*77e5bcceSSpandan Das+     *         returned
672*77e5bcceSSpandan Das+     */
673*77e5bcceSSpandan Das+    public String getPropertyByNamespaceSafelyAsString(final String namespace,final String name) {
674*77e5bcceSSpandan Das+        Integer i = propertyIndex(namespace,name);
675*77e5bcceSSpandan Das+        if (i != null) {
676*77e5bcceSSpandan Das+            Object foo = getProperty(i.intValue());
677*77e5bcceSSpandan Das+            if (foo == null) {
678*77e5bcceSSpandan Das+                return EMPTY_STRING;
679*77e5bcceSSpandan Das+            } else {
680*77e5bcceSSpandan Das+                return foo.toString();
681*77e5bcceSSpandan Das+            }
682*77e5bcceSSpandan Das+        } else {
683*77e5bcceSSpandan Das+            return EMPTY_STRING;
684*77e5bcceSSpandan Das+        }
685*77e5bcceSSpandan Das+    }
686*77e5bcceSSpandan Das+
687*77e5bcceSSpandan Das+    /**
688*77e5bcceSSpandan Das+     * Get a property without chance of throwing an exception. An object can be
689*77e5bcceSSpandan Das+     * provided to this method; if the property is not found, this object will
690*77e5bcceSSpandan Das+     * be returned.
691*77e5bcceSSpandan Das+     *
692*77e5bcceSSpandan Das+     * @param defaultThing
693*77e5bcceSSpandan Das+     *            the object to return if the property is not found
694*77e5bcceSSpandan Das+     * @return the property if it exists; defaultThing if the property does not
695*77e5bcceSSpandan Das+     *         exist
696*77e5bcceSSpandan Das+     */
697*77e5bcceSSpandan Das+    public Object getPropertySafely(final String namespace,final String name, final Object defaultThing) {
698*77e5bcceSSpandan Das+        Integer i = propertyIndex(namespace,name);
699*77e5bcceSSpandan Das+        if (i != null) {
700*77e5bcceSSpandan Das+            return getProperty(i.intValue());
701*77e5bcceSSpandan Das+        } else {
702*77e5bcceSSpandan Das+            return defaultThing;
703*77e5bcceSSpandan Das+        }
704*77e5bcceSSpandan Das+    }
705*77e5bcceSSpandan Das+
706*77e5bcceSSpandan Das+    /**
707*77e5bcceSSpandan Das+     * Get the toString value of a property without chance of throwing an
708*77e5bcceSSpandan Das+     * exception. An object can be provided to this method; if the property is
709*77e5bcceSSpandan Das+     * not found, this object's string representation will be returned.
710*77e5bcceSSpandan Das+     *
711*77e5bcceSSpandan Das+     * @param defaultThing
712*77e5bcceSSpandan Das+     *            toString of the object to return if the property is not found
713*77e5bcceSSpandan Das+     * @return the property toString if it exists; defaultThing toString if the
714*77e5bcceSSpandan Das+     *         property does not exist, if the defaultThing is null #EMPTY_STRING
715*77e5bcceSSpandan Das+     *         is returned
716*77e5bcceSSpandan Das+     */
717*77e5bcceSSpandan Das+    public String getPropertySafelyAsString(final String namespace,final String name,
718*77e5bcceSSpandan Das+                                            final Object defaultThing) {
719*77e5bcceSSpandan Das+        Integer i = propertyIndex(namespace,name);
720*77e5bcceSSpandan Das+        if (i != null) {
721*77e5bcceSSpandan Das+            Object property = getProperty(i.intValue());
722*77e5bcceSSpandan Das+            if (property != null) {
723*77e5bcceSSpandan Das+                return property.toString();
724*77e5bcceSSpandan Das+            } else {
725*77e5bcceSSpandan Das+                return EMPTY_STRING;
726*77e5bcceSSpandan Das+            }
727*77e5bcceSSpandan Das+        } else {
728*77e5bcceSSpandan Das+            if (defaultThing != null) {
729*77e5bcceSSpandan Das+                return defaultThing.toString();
730*77e5bcceSSpandan Das+            } else {
731*77e5bcceSSpandan Das+                return EMPTY_STRING;
732*77e5bcceSSpandan Das+            }
733*77e5bcceSSpandan Das+        }
734*77e5bcceSSpandan Das+    }
735*77e5bcceSSpandan Das+
736*77e5bcceSSpandan Das+    /**
737*77e5bcceSSpandan Das+     * Get the primitive property with the given name.
738*77e5bcceSSpandan Das+     *
739*77e5bcceSSpandan Das+     * @param name
740*77e5bcceSSpandan Das+     * @return PropertyInfo containing an empty string if property either complex or empty
741*77e5bcceSSpandan Das+     */
742*77e5bcceSSpandan Das+    public Object getPrimitiveProperty(final String namespace,final String name){
743*77e5bcceSSpandan Das+        Integer index = propertyIndex(namespace,name);
744*77e5bcceSSpandan Das+        if (index != null){
745*77e5bcceSSpandan Das+            PropertyInfo propertyInfo = (PropertyInfo) properties.elementAt(index.intValue());
746*77e5bcceSSpandan Das+            if (propertyInfo.getType()!=SoapObject.class && propertyInfo.getValue()!=null){
747*77e5bcceSSpandan Das+                return propertyInfo.getValue();
748*77e5bcceSSpandan Das+            } else {
749*77e5bcceSSpandan Das+                propertyInfo = new PropertyInfo();
750*77e5bcceSSpandan Das+                propertyInfo.setType(String.class);
751*77e5bcceSSpandan Das+                propertyInfo.setValue(EMPTY_STRING);
752*77e5bcceSSpandan Das+                propertyInfo.setName(name);
753*77e5bcceSSpandan Das+                propertyInfo.setNamespace(namespace);
754*77e5bcceSSpandan Das+                return (Object) propertyInfo.getValue();
755*77e5bcceSSpandan Das+            }
756*77e5bcceSSpandan Das+        } else {
757*77e5bcceSSpandan Das+            throw new RuntimeException("illegal property: " + name);
758*77e5bcceSSpandan Das+        }
759*77e5bcceSSpandan Das+    }
760*77e5bcceSSpandan Das+
761*77e5bcceSSpandan Das+    /**
762*77e5bcceSSpandan Das+     * Get the toString value of the primitive property with the given name.
763*77e5bcceSSpandan Das+     * Returns empty string if property either complex or empty
764*77e5bcceSSpandan Das+     *
765*77e5bcceSSpandan Das+     * @param name
766*77e5bcceSSpandan Das+     * @return the string value of the property
767*77e5bcceSSpandan Das+     */
768*77e5bcceSSpandan Das+    public String getPrimitivePropertyAsString(final String namespace,final String name){
769*77e5bcceSSpandan Das+        Integer index = propertyIndex(namespace,name);
770*77e5bcceSSpandan Das+        if (index != null){
771*77e5bcceSSpandan Das+            PropertyInfo propertyInfo = (PropertyInfo) properties.elementAt(index.intValue());
772*77e5bcceSSpandan Das+            if (propertyInfo.getType()!=SoapObject.class && propertyInfo.getValue()!=null){
773*77e5bcceSSpandan Das+                return propertyInfo.getValue().toString();
774*77e5bcceSSpandan Das+            } else {
775*77e5bcceSSpandan Das+                return EMPTY_STRING;
776*77e5bcceSSpandan Das+            }
777*77e5bcceSSpandan Das+        } else {
778*77e5bcceSSpandan Das+            throw new RuntimeException("illegal property: " + name);
779*77e5bcceSSpandan Das+        }
780*77e5bcceSSpandan Das+    }
781*77e5bcceSSpandan Das+
782*77e5bcceSSpandan Das+    /**
783*77e5bcceSSpandan Das+     * Get the toString value of a primitive property without chance of throwing an
784*77e5bcceSSpandan Das+     * exception
785*77e5bcceSSpandan Das+     *
786*77e5bcceSSpandan Das+     * @param name
787*77e5bcceSSpandan Das+     * @return the string value of the property if it exists and is primitive; if not, #EMPTY_STRING is
788*77e5bcceSSpandan Das+     *         returned
789*77e5bcceSSpandan Das+     */
790*77e5bcceSSpandan Das+    public Object getPrimitivePropertySafely(final String namespace,final String name) {
791*77e5bcceSSpandan Das+        Integer index = propertyIndex(namespace,name);
792*77e5bcceSSpandan Das+        if (index != null){
793*77e5bcceSSpandan Das+            PropertyInfo propertyInfo = (PropertyInfo) properties.elementAt(index.intValue());
794*77e5bcceSSpandan Das+            if (propertyInfo.getType()!=SoapObject.class && propertyInfo.getValue()!=null){
795*77e5bcceSSpandan Das+                return propertyInfo.getValue().toString();
796*77e5bcceSSpandan Das+            } else {
797*77e5bcceSSpandan Das+                propertyInfo = new PropertyInfo();
798*77e5bcceSSpandan Das+                propertyInfo.setType(String.class);
799*77e5bcceSSpandan Das+                propertyInfo.setValue(EMPTY_STRING);
800*77e5bcceSSpandan Das+                propertyInfo.setName(name);
801*77e5bcceSSpandan Das+                propertyInfo.setNamespace(namespace);
802*77e5bcceSSpandan Das+                return (Object) propertyInfo.getValue();
803*77e5bcceSSpandan Das+            }
804*77e5bcceSSpandan Das+        } else {
805*77e5bcceSSpandan Das+            return new NullSoapObject();
806*77e5bcceSSpandan Das+        }
807*77e5bcceSSpandan Das+    }
808*77e5bcceSSpandan Das+
809*77e5bcceSSpandan Das+    /**
810*77e5bcceSSpandan Das+     * Get the toString value of a primitive property without chance of throwing an
811*77e5bcceSSpandan Das+     * exception
812*77e5bcceSSpandan Das+     *
813*77e5bcceSSpandan Das+     * @param name
814*77e5bcceSSpandan Das+     * @return the string value of the property if it exists and is primitive; if not, #EMPTY_STRING is
815*77e5bcceSSpandan Das+     *         returned
816*77e5bcceSSpandan Das+     */
817*77e5bcceSSpandan Das+    public String getPrimitivePropertySafelyAsString(final String namespace,final String name) {
818*77e5bcceSSpandan Das+        Integer index = propertyIndex(namespace,name);
819*77e5bcceSSpandan Das+        if (index != null){
820*77e5bcceSSpandan Das+            PropertyInfo propertyInfo = (PropertyInfo) properties.elementAt(index.intValue());
821*77e5bcceSSpandan Das+            if (propertyInfo.getType()!=SoapObject.class && propertyInfo.getValue()!=null){
822*77e5bcceSSpandan Das+                return propertyInfo.getValue().toString();
823*77e5bcceSSpandan Das+            } else {
824*77e5bcceSSpandan Das+                return EMPTY_STRING;
825*77e5bcceSSpandan Das+            }
826*77e5bcceSSpandan Das+        } else {
827*77e5bcceSSpandan Das+            return EMPTY_STRING;
828*77e5bcceSSpandan Das+        }
829*77e5bcceSSpandan Das+    }
830*77e5bcceSSpandan Das+
831*77e5bcceSSpandan Das+    /**
832*77e5bcceSSpandan Das+     * Knows whether the given property exists
833*77e5bcceSSpandan Das+     */
834*77e5bcceSSpandan Das+    public boolean hasProperty(final String namespace,final String name) {
835*77e5bcceSSpandan Das+        if (propertyIndex(namespace,name) != null) {
836*77e5bcceSSpandan Das+            return true;
837*77e5bcceSSpandan Das+        } else {
838*77e5bcceSSpandan Das+            return false;
839*77e5bcceSSpandan Das+        }
840*77e5bcceSSpandan Das+    }
841*77e5bcceSSpandan Das+
842*77e5bcceSSpandan Das+    /**
843*77e5bcceSSpandan Das+     * Get the toString value of the property.
844*77e5bcceSSpandan Das+     *
845*77e5bcceSSpandan Das+     * @param namespace
846*77e5bcceSSpandan Das+     * @param name
847*77e5bcceSSpandan Das+     * @return
848*77e5bcceSSpandan Das+     */
849*77e5bcceSSpandan Das+
850*77e5bcceSSpandan Das+    public String getPropertyAsString(String namespace,String name) {
851*77e5bcceSSpandan Das+        Integer index = propertyIndex(namespace,name);
852*77e5bcceSSpandan Das+        if (index != null) {
853*77e5bcceSSpandan Das+            return getProperty(index.intValue()).toString();
854*77e5bcceSSpandan Das+        } else {
855*77e5bcceSSpandan Das+            throw new RuntimeException("illegal property: " + name);
856*77e5bcceSSpandan Das+        }
857*77e5bcceSSpandan Das+    }
858*77e5bcceSSpandan Das+
859*77e5bcceSSpandan Das     /**
860*77e5bcceSSpandan Das      * Get the toString value of the property.
861*77e5bcceSSpandan Das      *
862*77e5bcceSSpandan Das@@ -301,9 +527,9 @@ public class SoapObject extends AttributeContainer implements KvmSerializable {
863*77e5bcceSSpandan Das      */
864*77e5bcceSSpandan Das     public Object getPrimitiveProperty(final String name) {
865*77e5bcceSSpandan Das         Integer index = propertyIndex(name);
866*77e5bcceSSpandan Das-        if (index != null) {
867*77e5bcceSSpandan Das+        if (index != null){
868*77e5bcceSSpandan Das             PropertyInfo propertyInfo = (PropertyInfo) properties.elementAt(index.intValue());
869*77e5bcceSSpandan Das-            if (propertyInfo.getType() != SoapObject.class) {
870*77e5bcceSSpandan Das+            if (propertyInfo.getType()!=SoapObject.class && propertyInfo.getValue()!=null){
871*77e5bcceSSpandan Das                 return propertyInfo.getValue();
872*77e5bcceSSpandan Das             } else {
873*77e5bcceSSpandan Das                 propertyInfo = new PropertyInfo();
874*77e5bcceSSpandan Das@@ -326,9 +552,9 @@ public class SoapObject extends AttributeContainer implements KvmSerializable {
875*77e5bcceSSpandan Das      */
876*77e5bcceSSpandan Das     public String getPrimitivePropertyAsString(final String name) {
877*77e5bcceSSpandan Das         Integer index = propertyIndex(name);
878*77e5bcceSSpandan Das-        if (index != null) {
879*77e5bcceSSpandan Das+        if (index != null){
880*77e5bcceSSpandan Das             PropertyInfo propertyInfo = (PropertyInfo) properties.elementAt(index.intValue());
881*77e5bcceSSpandan Das-            if (propertyInfo.getType() != SoapObject.class) {
882*77e5bcceSSpandan Das+            if (propertyInfo.getType()!=SoapObject.class && propertyInfo.getValue()!=null){
883*77e5bcceSSpandan Das                 return propertyInfo.getValue().toString();
884*77e5bcceSSpandan Das             } else {
885*77e5bcceSSpandan Das                 return EMPTY_STRING;
886*77e5bcceSSpandan Das@@ -348,9 +574,9 @@ public class SoapObject extends AttributeContainer implements KvmSerializable {
887*77e5bcceSSpandan Das      */
888*77e5bcceSSpandan Das     public Object getPrimitivePropertySafely(final String name) {
889*77e5bcceSSpandan Das         Integer index = propertyIndex(name);
890*77e5bcceSSpandan Das-        if (index != null) {
891*77e5bcceSSpandan Das+        if (index != null){
892*77e5bcceSSpandan Das             PropertyInfo propertyInfo = (PropertyInfo) properties.elementAt(index.intValue());
893*77e5bcceSSpandan Das-            if (propertyInfo.getType() != SoapObject.class) {
894*77e5bcceSSpandan Das+            if (propertyInfo.getType()!=SoapObject.class && propertyInfo.getValue()!=null){
895*77e5bcceSSpandan Das                 return propertyInfo.getValue().toString();
896*77e5bcceSSpandan Das             } else {
897*77e5bcceSSpandan Das                 propertyInfo = new PropertyInfo();
898*77e5bcceSSpandan Das@@ -374,9 +600,9 @@ public class SoapObject extends AttributeContainer implements KvmSerializable {
899*77e5bcceSSpandan Das      */
900*77e5bcceSSpandan Das     public String getPrimitivePropertySafelyAsString(final String name) {
901*77e5bcceSSpandan Das         Integer index = propertyIndex(name);
902*77e5bcceSSpandan Das-        if (index != null) {
903*77e5bcceSSpandan Das+        if (index != null){
904*77e5bcceSSpandan Das             PropertyInfo propertyInfo = (PropertyInfo) properties.elementAt(index.intValue());
905*77e5bcceSSpandan Das-            if (propertyInfo.getType() != SoapObject.class) {
906*77e5bcceSSpandan Das+            if (propertyInfo.getType()!=SoapObject.class && propertyInfo.getValue()!=null){
907*77e5bcceSSpandan Das                 return propertyInfo.getValue().toString();
908*77e5bcceSSpandan Das             } else {
909*77e5bcceSSpandan Das                 return EMPTY_STRING;
910*77e5bcceSSpandan Das@@ -397,6 +623,18 @@ public class SoapObject extends AttributeContainer implements KvmSerializable {
911*77e5bcceSSpandan Das         return null;
912*77e5bcceSSpandan Das     }
913*77e5bcceSSpandan Das
914*77e5bcceSSpandan Das+
915*77e5bcceSSpandan Das+    private Integer propertyIndex(String namespace,String name) {
916*77e5bcceSSpandan Das+        if (name != null && namespace!=null) {
917*77e5bcceSSpandan Das+            for (int i = 0; i < properties.size(); i++) {
918*77e5bcceSSpandan Das+                PropertyInfo info= (PropertyInfo) properties.elementAt(i);
919*77e5bcceSSpandan Das+                if (name.equals(info.getName()) && namespace.equals(info.getNamespace())) {
920*77e5bcceSSpandan Das+                    return new Integer(i);
921*77e5bcceSSpandan Das+                }
922*77e5bcceSSpandan Das+            }
923*77e5bcceSSpandan Das+        }
924*77e5bcceSSpandan Das+        return null;
925*77e5bcceSSpandan Das+    }
926*77e5bcceSSpandan Das     /**
927*77e5bcceSSpandan Das      * Returns the number of properties
928*77e5bcceSSpandan Das      *
929*77e5bcceSSpandan Das@@ -453,6 +691,17 @@ public class SoapObject extends AttributeContainer implements KvmSerializable {
930*77e5bcceSSpandan Das         }
931*77e5bcceSSpandan Das     }
932*77e5bcceSSpandan Das
933*77e5bcceSSpandan Das+    public PropertyInfo getPropertyInfo(int index) {
934*77e5bcceSSpandan Das+        Object element = properties.elementAt(index);
935*77e5bcceSSpandan Das+        if (element instanceof PropertyInfo) {
936*77e5bcceSSpandan Das+            PropertyInfo p = (PropertyInfo) element;
937*77e5bcceSSpandan Das+            return p;
938*77e5bcceSSpandan Das+        } else {
939*77e5bcceSSpandan Das+            // SoapObject
940*77e5bcceSSpandan Das+            return null;
941*77e5bcceSSpandan Das+        }
942*77e5bcceSSpandan Das+    }
943*77e5bcceSSpandan Das+
944*77e5bcceSSpandan Das     /**
945*77e5bcceSSpandan Das      * Creates a new SoapObject based on this, allows usage of SoapObjects as
946*77e5bcceSSpandan Das      * templates. One application is to set the expected return type of a soap
947*77e5bcceSSpandan Das@@ -466,17 +715,17 @@ public class SoapObject extends AttributeContainer implements KvmSerializable {
948*77e5bcceSSpandan Das             Object prop = properties.elementAt(propIndex);
949*77e5bcceSSpandan Das             if (prop instanceof PropertyInfo) {
950*77e5bcceSSpandan Das                 PropertyInfo propertyInfo = (PropertyInfo) properties.elementAt(propIndex);
951*77e5bcceSSpandan Das-                PropertyInfo propertyInfoClonned = (PropertyInfo) propertyInfo.clone();
952*77e5bcceSSpandan Das-                o.addProperty(propertyInfoClonned);
953*77e5bcceSSpandan Das-            } else if (prop instanceof SoapObject) {
954*77e5bcceSSpandan Das-                o.addSoapObject(((SoapObject) prop).newInstance());
955*77e5bcceSSpandan Das+                PropertyInfo propertyInfoClonned = (PropertyInfo)propertyInfo.clone();
956*77e5bcceSSpandan Das+                o.addProperty( propertyInfoClonned );
957*77e5bcceSSpandan Das+            } else if(prop instanceof SoapObject) {
958*77e5bcceSSpandan Das+                o.addSoapObject(((SoapObject)prop).newInstance());
959*77e5bcceSSpandan Das             }
960*77e5bcceSSpandan Das         }
961*77e5bcceSSpandan Das         for (int attribIndex = 0; attribIndex < getAttributeCount(); attribIndex++) {
962*77e5bcceSSpandan Das             AttributeInfo newAI = new AttributeInfo();
963*77e5bcceSSpandan Das             getAttributeInfo(attribIndex, newAI);
964*77e5bcceSSpandan Das             AttributeInfo attributeInfo = newAI; // (AttributeInfo)
965*77e5bcceSSpandan Das-                                                 // attributes.elementAt(attribIndex);
966*77e5bcceSSpandan Das+                                                    // attributes.elementAt(attribIndex);
967*77e5bcceSSpandan Das             o.addAttribute(attributeInfo);
968*77e5bcceSSpandan Das         }
969*77e5bcceSSpandan Das         return o;
970*77e5bcceSSpandan Das@@ -513,11 +762,49 @@ public class SoapObject extends AttributeContainer implements KvmSerializable {
971*77e5bcceSSpandan Das         propertyInfo.type = value == null ? PropertyInfo.OBJECT_CLASS : value
972*77e5bcceSSpandan Das                 .getClass();
973*77e5bcceSSpandan Das         propertyInfo.value = value;
974*77e5bcceSSpandan Das+        return addProperty(propertyInfo);
975*77e5bcceSSpandan Das+    }
976*77e5bcceSSpandan Das+
977*77e5bcceSSpandan Das+    /**
978*77e5bcceSSpandan Das+     * Adds a property (parameter) to the object. This is essentially a sub
979*77e5bcceSSpandan Das+     * element.
980*77e5bcceSSpandan Das+     *
981*77e5bcceSSpandan Das+     * @param namespace
982*77e5bcceSSpandan Das+     *            The namespace of the property
983*77e5bcceSSpandan Das+     * @param name
984*77e5bcceSSpandan Das+     *            The name of the property
985*77e5bcceSSpandan Das+     * @param value
986*77e5bcceSSpandan Das+     *            the value of the property
987*77e5bcceSSpandan Das+     */
988*77e5bcceSSpandan Das+    public SoapObject addProperty(String namespace,String name, Object value) {
989*77e5bcceSSpandan Das+        PropertyInfo propertyInfo = new PropertyInfo();
990*77e5bcceSSpandan Das+        propertyInfo.name = name;
991*77e5bcceSSpandan Das         propertyInfo.namespace = namespace;
992*77e5bcceSSpandan Das-        ///M: HS20 modify by Jungo
993*77e5bcceSSpandan Das+        propertyInfo.type = value == null ? PropertyInfo.OBJECT_CLASS : value
994*77e5bcceSSpandan Das+                .getClass();
995*77e5bcceSSpandan Das+        propertyInfo.value = value;
996*77e5bcceSSpandan Das         return addProperty(propertyInfo);
997*77e5bcceSSpandan Das     }
998*77e5bcceSSpandan Das
999*77e5bcceSSpandan Das+    /**
1000*77e5bcceSSpandan Das+     * Add a property only if the value is not null.
1001*77e5bcceSSpandan Das+     *
1002*77e5bcceSSpandan Das+     * @param namespace
1003*77e5bcceSSpandan Das+     *            The namespace of the property
1004*77e5bcceSSpandan Das+     * @param name
1005*77e5bcceSSpandan Das+     *            The name of the property
1006*77e5bcceSSpandan Das+     * @param value
1007*77e5bcceSSpandan Das+     *            the value of the property
1008*77e5bcceSSpandan Das+     * @return
1009*77e5bcceSSpandan Das+     */
1010*77e5bcceSSpandan Das+    public SoapObject addPropertyIfValue(String namespace,String name, Object value) {
1011*77e5bcceSSpandan Das+        if (value != null) {
1012*77e5bcceSSpandan Das+            return addProperty(namespace,name, value);
1013*77e5bcceSSpandan Das+        } else {
1014*77e5bcceSSpandan Das+            return this;
1015*77e5bcceSSpandan Das+        }
1016*77e5bcceSSpandan Das+    }
1017*77e5bcceSSpandan Das+
1018*77e5bcceSSpandan Das     /**
1019*77e5bcceSSpandan Das      * Add a property only if the value is not null.
1020*77e5bcceSSpandan Das      *
1021*77e5bcceSSpandan Das@@ -597,12 +884,12 @@ public class SoapObject extends AttributeContainer implements KvmSerializable {
1022*77e5bcceSSpandan Das         StringBuffer buf = new StringBuffer(EMPTY_STRING + name + "{");
1023*77e5bcceSSpandan Das         for (int i = 0; i < getPropertyCount(); i++) {
1024*77e5bcceSSpandan Das             Object prop = properties.elementAt(i);
1025*77e5bcceSSpandan Das-            if (prop instanceof PropertyInfo) {
1026*77e5bcceSSpandan Das+            if(prop instanceof PropertyInfo) {
1027*77e5bcceSSpandan Das                 buf.append(EMPTY_STRING)
1028*77e5bcceSSpandan Das-                        .append(((PropertyInfo) prop).getName())
1029*77e5bcceSSpandan Das-                        .append("=")
1030*77e5bcceSSpandan Das-                        .append(getProperty(i))
1031*77e5bcceSSpandan Das-                        .append("; ");
1032*77e5bcceSSpandan Das+                    .append(((PropertyInfo) prop).getName())
1033*77e5bcceSSpandan Das+                    .append("=")
1034*77e5bcceSSpandan Das+                    .append(getProperty(i))
1035*77e5bcceSSpandan Das+                    .append("; ");
1036*77e5bcceSSpandan Das             } else {
1037*77e5bcceSSpandan Das                 buf.append(((SoapObject) prop).toString());
1038*77e5bcceSSpandan Das             }
1039*77e5bcceSSpandan Das@@ -610,4 +897,17 @@ public class SoapObject extends AttributeContainer implements KvmSerializable {
1040*77e5bcceSSpandan Das         buf.append("}");
1041*77e5bcceSSpandan Das         return buf.toString();
1042*77e5bcceSSpandan Das     }
1043*77e5bcceSSpandan Das+    public Object getInnerText() {
1044*77e5bcceSSpandan Das+         return innerText;
1045*77e5bcceSSpandan Das+    }
1046*77e5bcceSSpandan Das+
1047*77e5bcceSSpandan Das+    public void setInnerText(Object innerText)
1048*77e5bcceSSpandan Das+    {
1049*77e5bcceSSpandan Das+        this.innerText=innerText;
1050*77e5bcceSSpandan Das+    }
1051*77e5bcceSSpandan Das+
1052*77e5bcceSSpandan Das+    public void removePropertyInfo(Object info)
1053*77e5bcceSSpandan Das+    {
1054*77e5bcceSSpandan Das+        properties.remove(info);
1055*77e5bcceSSpandan Das+    }
1056*77e5bcceSSpandan Das }
1057*77e5bcceSSpandan Dasdiff --git a/ksoap2-base/src/main/java/org/ksoap2/serialization/SoapPrimitive.java b/ksoap2-base/src/main/java/org/ksoap2/serialization/SoapPrimitive.java
1058*77e5bcceSSpandan Dasindex d09f7a7..32fe333 100644
1059*77e5bcceSSpandan Das--- a/ksoap2-base/src/main/java/org/ksoap2/serialization/SoapPrimitive.java
1060*77e5bcceSSpandan Das+++ b/ksoap2-base/src/main/java/org/ksoap2/serialization/SoapPrimitive.java
1061*77e5bcceSSpandan Das@@ -34,11 +34,14 @@ package org.ksoap2.serialization;
1062*77e5bcceSSpandan Das  */
1063*77e5bcceSSpandan Das
1064*77e5bcceSSpandan Das public class SoapPrimitive extends AttributeContainer {
1065*77e5bcceSSpandan Das-    String namespace;
1066*77e5bcceSSpandan Das-    String name;
1067*77e5bcceSSpandan Das-    String value;
1068*77e5bcceSSpandan Das+    protected String namespace;
1069*77e5bcceSSpandan Das+    protected String name;
1070*77e5bcceSSpandan Das+    protected Object value;
1071*77e5bcceSSpandan Das
1072*77e5bcceSSpandan Das-    public SoapPrimitive(String namespace, String name, String value) {
1073*77e5bcceSSpandan Das+    public  static final Object NullSkip = new Object();
1074*77e5bcceSSpandan Das+    public  static final Object NullNilElement = new Object();
1075*77e5bcceSSpandan Das+
1076*77e5bcceSSpandan Das+    public SoapPrimitive(String namespace, String name, Object value) {
1077*77e5bcceSSpandan Das         this.namespace = namespace;
1078*77e5bcceSSpandan Das         this.name = name;
1079*77e5bcceSSpandan Das         this.value = value;
1080*77e5bcceSSpandan Das@@ -50,7 +53,7 @@ public class SoapPrimitive extends AttributeContainer {
1081*77e5bcceSSpandan Das         }
1082*77e5bcceSSpandan Das         SoapPrimitive p = (SoapPrimitive) o;
1083*77e5bcceSSpandan Das         boolean varsEqual = name.equals(p.name)
1084*77e5bcceSSpandan Das-                && (namespace == null ? p.namespace == null : namespace.equals(p.namespace))
1085*77e5bcceSSpandan Das+                && (namespace == null ? p.namespace == null:namespace.equals(p.namespace))
1086*77e5bcceSSpandan Das                 && (value == null ? (p.value == null) : value.equals(p.value));
1087*77e5bcceSSpandan Das         return varsEqual && attributesAreEqual(p);
1088*77e5bcceSSpandan Das     }
1089*77e5bcceSSpandan Das@@ -60,7 +63,7 @@ public class SoapPrimitive extends AttributeContainer {
1090*77e5bcceSSpandan Das     }
1091*77e5bcceSSpandan Das
1092*77e5bcceSSpandan Das     public String toString() {
1093*77e5bcceSSpandan Das-        return value;
1094*77e5bcceSSpandan Das+        return value != null ? value.toString() : null;
1095*77e5bcceSSpandan Das     }
1096*77e5bcceSSpandan Das
1097*77e5bcceSSpandan Das     public String getNamespace() {
1098*77e5bcceSSpandan Das@@ -70,4 +73,9 @@ public class SoapPrimitive extends AttributeContainer {
1099*77e5bcceSSpandan Das     public String getName() {
1100*77e5bcceSSpandan Das         return name;
1101*77e5bcceSSpandan Das     }
1102*77e5bcceSSpandan Das+
1103*77e5bcceSSpandan Das+    public Object getValue() {
1104*77e5bcceSSpandan Das+        return value;
1105*77e5bcceSSpandan Das+    }
1106*77e5bcceSSpandan Das+
1107*77e5bcceSSpandan Das }
1108*77e5bcceSSpandan Dasdiff --git a/ksoap2-base/src/main/java/org/ksoap2/serialization/SoapSerializationEnvelope.java b/ksoap2-base/src/main/java/org/ksoap2/serialization/SoapSerializationEnvelope.java
1109*77e5bcceSSpandan Dasindex dae09d2..ceeb3f4 100644
1110*77e5bcceSSpandan Das--- a/ksoap2-base/src/main/java/org/ksoap2/serialization/SoapSerializationEnvelope.java
1111*77e5bcceSSpandan Das+++ b/ksoap2-base/src/main/java/org/ksoap2/serialization/SoapSerializationEnvelope.java
1112*77e5bcceSSpandan Das@@ -27,9 +27,9 @@ import org.xmlpull.v1.XmlPullParserException;
1113*77e5bcceSSpandan Das import org.xmlpull.v1.XmlSerializer;
1114*77e5bcceSSpandan Das
1115*77e5bcceSSpandan Das import java.io.IOException;
1116*77e5bcceSSpandan Das+import java.util.ArrayList;
1117*77e5bcceSSpandan Das import java.util.Hashtable;
1118*77e5bcceSSpandan Das import java.util.Vector;
1119*77e5bcceSSpandan Das-import java.io.ByteArrayOutputStream;
1120*77e5bcceSSpandan Das
1121*77e5bcceSSpandan Das import org.kxml2.io.*;
1122*77e5bcceSSpandan Das
1123*77e5bcceSSpandan Das@@ -43,29 +43,29 @@ public class SoapSerializationEnvelope extends SoapEnvelope
1124*77e5bcceSSpandan Das     protected static final int QNAME_TYPE = 1;
1125*77e5bcceSSpandan Das     protected static final int QNAME_NAMESPACE = 0;
1126*77e5bcceSSpandan Das     protected static final int QNAME_MARSHAL = 3;
1127*77e5bcceSSpandan Das+    protected static final String NULL_LABEL = "null";
1128*77e5bcceSSpandan Das+    protected static final String NIL_LABEL = "nil";
1129*77e5bcceSSpandan Das+    static final Marshal DEFAULT_MARSHAL = new DM();
1130*77e5bcceSSpandan Das     private static final String ANY_TYPE_LABEL = "anyType";
1131*77e5bcceSSpandan Das     private static final String ARRAY_MAPPING_NAME = "Array";
1132*77e5bcceSSpandan Das-    private static final String NULL_LABEL = "null";
1133*77e5bcceSSpandan Das-    private static final String NIL_LABEL = "nil";
1134*77e5bcceSSpandan Das     private static final String HREF_LABEL = "href";
1135*77e5bcceSSpandan Das     private static final String ID_LABEL = "id";
1136*77e5bcceSSpandan Das     private static final String ROOT_LABEL = "root";
1137*77e5bcceSSpandan Das     private static final String TYPE_LABEL = "type";
1138*77e5bcceSSpandan Das     private static final String ITEM_LABEL = "item";
1139*77e5bcceSSpandan Das     private static final String ARRAY_TYPE_LABEL = "arrayType";
1140*77e5bcceSSpandan Das-    static final Marshal DEFAULT_MARSHAL = new DM();
1141*77e5bcceSSpandan Das     public Hashtable properties = new Hashtable();
1142*77e5bcceSSpandan Das-
1143*77e5bcceSSpandan Das-    Hashtable idMap = new Hashtable();
1144*77e5bcceSSpandan Das-    Vector multiRef; // = new Vector();
1145*77e5bcceSSpandan Das-
1146*77e5bcceSSpandan Das     /**
1147*77e5bcceSSpandan Das      * Set this variable to true if you don't want that type definitions for complex types/objects
1148*77e5bcceSSpandan Das      * are automatically generated (with type "anyType") in the XML-Request, if you don't call the
1149*77e5bcceSSpandan Das      * Method addMapping. This is needed by some Servers which have problems with these type-definitions.
1150*77e5bcceSSpandan Das      */
1151*77e5bcceSSpandan Das     public boolean implicitTypes;
1152*77e5bcceSSpandan Das-
1153*77e5bcceSSpandan Das+    /**
1154*77e5bcceSSpandan Das+     * If set to true then all properties with null value will be skipped from the soap message.
1155*77e5bcceSSpandan Das+     * If false then null properties will be sent as <element nil="true" />
1156*77e5bcceSSpandan Das+     */
1157*77e5bcceSSpandan Das+    public boolean skipNullProperties;
1158*77e5bcceSSpandan Das     /**
1159*77e5bcceSSpandan Das      * Set this variable to true for compatibility with what seems to be the default encoding for
1160*77e5bcceSSpandan Das      * .Net-Services. This feature is an extremely ugly hack. A much better option is to change the
1161*77e5bcceSSpandan Das@@ -96,9 +96,10 @@ public class SoapSerializationEnvelope extends SoapEnvelope
1162*77e5bcceSSpandan Das      * Set to true to add and ID and ROOT label to the envelope. Change to false for compatibility with WSDL.
1163*77e5bcceSSpandan Das      */
1164*77e5bcceSSpandan Das     protected boolean addAdornments = true;
1165*77e5bcceSSpandan Das+    Hashtable idMap = new Hashtable();
1166*77e5bcceSSpandan Das+    Vector multiRef; // = new Vector();
1167*77e5bcceSSpandan Das
1168*77e5bcceSSpandan Das-    public SoapSerializationEnvelope(int version)
1169*77e5bcceSSpandan Das-    {
1170*77e5bcceSSpandan Das+    public SoapSerializationEnvelope(int version) {
1171*77e5bcceSSpandan Das         super(version);
1172*77e5bcceSSpandan Das         addMapping(enc, ARRAY_MAPPING_NAME, PropertyInfo.VECTOR_CLASS);
1173*77e5bcceSSpandan Das         DEFAULT_MARSHAL.register(this);
1174*77e5bcceSSpandan Das@@ -107,23 +108,21 @@ public class SoapSerializationEnvelope extends SoapEnvelope
1175*77e5bcceSSpandan Das     /**
1176*77e5bcceSSpandan Das      * @return the addAdornments
1177*77e5bcceSSpandan Das      */
1178*77e5bcceSSpandan Das-    public boolean isAddAdornments()
1179*77e5bcceSSpandan Das-    {
1180*77e5bcceSSpandan Das+    public boolean isAddAdornments() {
1181*77e5bcceSSpandan Das         return addAdornments;
1182*77e5bcceSSpandan Das     }
1183*77e5bcceSSpandan Das
1184*77e5bcceSSpandan Das     /**
1185*77e5bcceSSpandan Das-     * @param addAdornments
1186*77e5bcceSSpandan Das-     *            the addAdornments to set
1187*77e5bcceSSpandan Das+     * @param addAdornments the addAdornments to set
1188*77e5bcceSSpandan Das      */
1189*77e5bcceSSpandan Das-    public void setAddAdornments(boolean addAdornments)
1190*77e5bcceSSpandan Das-    {
1191*77e5bcceSSpandan Das+    public void setAddAdornments(boolean addAdornments) {
1192*77e5bcceSSpandan Das         this.addAdornments = addAdornments;
1193*77e5bcceSSpandan Das     }
1194*77e5bcceSSpandan Das
1195*77e5bcceSSpandan Das     /**
1196*77e5bcceSSpandan Das      * Set the bodyOut to be empty so that no un-needed xml is create. The null value for bodyOut will
1197*77e5bcceSSpandan Das      * cause #writeBody to skip writing anything redundant.
1198*77e5bcceSSpandan Das+     *
1199*77e5bcceSSpandan Das      * @param emptyBody
1200*77e5bcceSSpandan Das      * @see "http://code.google.com/p/ksoap2-android/issues/detail?id=77"
1201*77e5bcceSSpandan Das      */
1202*77e5bcceSSpandan Das@@ -133,8 +132,7 @@ public class SoapSerializationEnvelope extends SoapEnvelope
1203*77e5bcceSSpandan Das         }
1204*77e5bcceSSpandan Das     }
1205*77e5bcceSSpandan Das
1206*77e5bcceSSpandan Das-    public void parseBody(XmlPullParser parser) throws IOException, XmlPullParserException
1207*77e5bcceSSpandan Das-    {
1208*77e5bcceSSpandan Das+    public void parseBody(XmlPullParser parser) throws IOException, XmlPullParserException {
1209*77e5bcceSSpandan Das         bodyIn = null;
1210*77e5bcceSSpandan Das         parser.nextTag();
1211*77e5bcceSSpandan Das         if (parser.getEventType() == XmlPullParser.START_TAG && parser.getNamespace().equals(env)
1212*77e5bcceSSpandan Das@@ -161,10 +159,11 @@ public class SoapSerializationEnvelope extends SoapEnvelope
1213*77e5bcceSSpandan Das         }
1214*77e5bcceSSpandan Das     }
1215*77e5bcceSSpandan Das
1216*77e5bcceSSpandan Das-    /** Read a SoapObject. This extracts any attributes and then reads the object as a KvmSerializable. */
1217*77e5bcceSSpandan Das+    /**
1218*77e5bcceSSpandan Das+     * Read a SoapObject. This extracts any attributes and then reads the object as a KvmSerializable.
1219*77e5bcceSSpandan Das+     */
1220*77e5bcceSSpandan Das     protected void readSerializable(XmlPullParser parser, SoapObject obj) throws IOException,
1221*77e5bcceSSpandan Das-            XmlPullParserException
1222*77e5bcceSSpandan Das-    {
1223*77e5bcceSSpandan Das+            XmlPullParserException {
1224*77e5bcceSSpandan Das         for (int counter = 0; counter < parser.getAttributeCount(); counter++) {
1225*77e5bcceSSpandan Das             String attributeName = parser.getAttributeName(counter);
1226*77e5bcceSSpandan Das             String value = parser.getAttributeValue(counter);
1227*77e5bcceSSpandan Das@@ -173,11 +172,21 @@ public class SoapSerializationEnvelope extends SoapEnvelope
1228*77e5bcceSSpandan Das         readSerializable(parser, (KvmSerializable) obj);
1229*77e5bcceSSpandan Das     }
1230*77e5bcceSSpandan Das
1231*77e5bcceSSpandan Das-    /** Read a KvmSerializable. */
1232*77e5bcceSSpandan Das+    /**
1233*77e5bcceSSpandan Das+     * Read a KvmSerializable.
1234*77e5bcceSSpandan Das+     */
1235*77e5bcceSSpandan Das     protected void readSerializable(XmlPullParser parser, KvmSerializable obj) throws IOException,
1236*77e5bcceSSpandan Das-            XmlPullParserException
1237*77e5bcceSSpandan Das-    {
1238*77e5bcceSSpandan Das-        while (parser.nextTag() != XmlPullParser.END_TAG) {
1239*77e5bcceSSpandan Das+            XmlPullParserException {
1240*77e5bcceSSpandan Das+        int tag = 0;
1241*77e5bcceSSpandan Das+        try {
1242*77e5bcceSSpandan Das+            tag = parser.nextTag();
1243*77e5bcceSSpandan Das+        } catch (XmlPullParserException e) {
1244*77e5bcceSSpandan Das+            if(obj instanceof HasInnerText){
1245*77e5bcceSSpandan Das+                 ((HasInnerText)obj).setInnerText((parser.getText() != null) ? parser.getText() : "");
1246*77e5bcceSSpandan Das+            }
1247*77e5bcceSSpandan Das+            tag = parser.nextTag();
1248*77e5bcceSSpandan Das+        }
1249*77e5bcceSSpandan Das+        while (tag != XmlPullParser.END_TAG) {
1250*77e5bcceSSpandan Das             String name = parser.getName();
1251*77e5bcceSSpandan Das             if (!implicitTypes || !(obj instanceof SoapObject)) {
1252*77e5bcceSSpandan Das                 PropertyInfo info = new PropertyInfo();
1253*77e5bcceSSpandan Das@@ -188,8 +197,7 @@ public class SoapSerializationEnvelope extends SoapEnvelope
1254*77e5bcceSSpandan Das                     info.clear();
1255*77e5bcceSSpandan Das                     obj.getPropertyInfo(i, properties, info);
1256*77e5bcceSSpandan Das
1257*77e5bcceSSpandan Das-                    if ((name.equals(info.name) && info.namespace == null)
1258*77e5bcceSSpandan Das-                            ||
1259*77e5bcceSSpandan Das+                    if ((name.equals(info.name) && info.namespace == null) ||
1260*77e5bcceSSpandan Das                             (name.equals(info.name) && parser.getNamespace().equals(info.namespace))) {
1261*77e5bcceSSpandan Das                         propertyFound = true;
1262*77e5bcceSSpandan Das                         obj.setProperty(i, read(parser, obj, i, null, null, info));
1263*77e5bcceSSpandan Das@@ -199,21 +207,42 @@ public class SoapSerializationEnvelope extends SoapEnvelope
1264*77e5bcceSSpandan Das                 if (!propertyFound) {
1265*77e5bcceSSpandan Das                     if (avoidExceptionForUnknownProperty) {
1266*77e5bcceSSpandan Das                         // Dummy loop to read until corresponding END tag
1267*77e5bcceSSpandan Das-                        while (parser.next() != XmlPullParser.END_TAG
1268*77e5bcceSSpandan Das-                                || !name.equals(parser.getName())) {
1269*77e5bcceSSpandan Das+                        while (parser.next() != XmlPullParser.END_TAG || !name.equals(parser.getName())) {
1270*77e5bcceSSpandan Das                         }
1271*77e5bcceSSpandan Das                         ;
1272*77e5bcceSSpandan Das                     } else {
1273*77e5bcceSSpandan Das                         throw new RuntimeException("Unknown Property: " + name);
1274*77e5bcceSSpandan Das                     }
1275*77e5bcceSSpandan Das+                } else {
1276*77e5bcceSSpandan Das+                    if (obj instanceof HasAttributes) {
1277*77e5bcceSSpandan Das+                        HasAttributes soapObject = (HasAttributes) obj;
1278*77e5bcceSSpandan Das+                        int cnt = parser.getAttributeCount();
1279*77e5bcceSSpandan Das+                        for (int counter = 0; counter < cnt; counter++) {
1280*77e5bcceSSpandan Das+                            AttributeInfo attributeInfo = new AttributeInfo();
1281*77e5bcceSSpandan Das+                            attributeInfo.setName(parser.getAttributeName(counter));
1282*77e5bcceSSpandan Das+                            attributeInfo.setValue(parser.getAttributeValue(counter));
1283*77e5bcceSSpandan Das+                            attributeInfo.setNamespace(parser.getAttributeNamespace(counter));
1284*77e5bcceSSpandan Das+                            attributeInfo.setType(parser.getAttributeType(counter));
1285*77e5bcceSSpandan Das+                            soapObject.setAttribute(attributeInfo);
1286*77e5bcceSSpandan Das+
1287*77e5bcceSSpandan Das+                        }
1288*77e5bcceSSpandan Das+                    }
1289*77e5bcceSSpandan Das                 }
1290*77e5bcceSSpandan Das             } else {
1291*77e5bcceSSpandan Das                 // I can only make this work for SoapObjects - hence the check above
1292*77e5bcceSSpandan Das                 // I don't understand namespaces well enough to know whether it is correct in the next line...
1293*77e5bcceSSpandan Das-                ((SoapObject) obj).addProperty(parser.getName(),
1294*77e5bcceSSpandan Das-                        read(parser, obj, obj.getPropertyCount(),
1295*77e5bcceSSpandan Das-                                ((SoapObject) obj).getNamespace(), name, PropertyInfo.OBJECT_TYPE));
1296*77e5bcceSSpandan Das+                ((SoapObject) obj).addProperty(parser.getName(), read(parser, obj, obj.getPropertyCount(),
1297*77e5bcceSSpandan Das+                        ((SoapObject) obj).getNamespace(), name, PropertyInfo.OBJECT_TYPE));
1298*77e5bcceSSpandan Das+            }
1299*77e5bcceSSpandan Das+            try {
1300*77e5bcceSSpandan Das+                tag = parser.nextTag();
1301*77e5bcceSSpandan Das+            } catch (XmlPullParserException e) {
1302*77e5bcceSSpandan Das+                if(obj instanceof HasInnerText){
1303*77e5bcceSSpandan Das+                    ((HasInnerText)obj).setInnerText((parser.getText() != null) ? parser.getText() : "");
1304*77e5bcceSSpandan Das+                }
1305*77e5bcceSSpandan Das+                tag = parser.nextTag();
1306*77e5bcceSSpandan Das             }
1307*77e5bcceSSpandan Das+
1308*77e5bcceSSpandan Das         }
1309*77e5bcceSSpandan Das         parser.require(XmlPullParser.END_TAG, null, null);
1310*77e5bcceSSpandan Das     }
1311*77e5bcceSSpandan Das@@ -278,9 +307,8 @@ public class SoapSerializationEnvelope extends SoapEnvelope
1312*77e5bcceSSpandan Das             }
1313*77e5bcceSSpandan Das
1314*77e5bcceSSpandan Das             while (parser.getEventType() != XmlPullParser.END_TAG) {
1315*77e5bcceSSpandan Das-                so.addProperty(parser.getName(),
1316*77e5bcceSSpandan Das-                        read(parser, so, so.getPropertyCount(), null, null,
1317*77e5bcceSSpandan Das-                                PropertyInfo.OBJECT_TYPE));
1318*77e5bcceSSpandan Das+                so.addProperty(parser.getNamespace(),parser.getName(), read(parser, so, so.getPropertyCount(),
1319*77e5bcceSSpandan Das+                        null, null, PropertyInfo.OBJECT_TYPE));
1320*77e5bcceSSpandan Das                 parser.nextTag();
1321*77e5bcceSSpandan Das             }
1322*77e5bcceSSpandan Das             result = so;
1323*77e5bcceSSpandan Das@@ -293,12 +321,15 @@ public class SoapSerializationEnvelope extends SoapEnvelope
1324*77e5bcceSSpandan Das         if (value == null) {
1325*77e5bcceSSpandan Das             return dflt;
1326*77e5bcceSSpandan Das         }
1327*77e5bcceSSpandan Das-        return value.length() - start < 3 ? dflt : Integer.parseInt(value.substring(start + 1,
1328*77e5bcceSSpandan Das-                value.length() - 1));
1329*77e5bcceSSpandan Das+        try {
1330*77e5bcceSSpandan Das+            return value.length() - start < 3 ? dflt : Integer.parseInt(value.substring(start + 1,
1331*77e5bcceSSpandan Das+                    value.length() - 1));
1332*77e5bcceSSpandan Das+        } catch (Exception ex) {
1333*77e5bcceSSpandan Das+            return dflt;
1334*77e5bcceSSpandan Das+        }
1335*77e5bcceSSpandan Das     }
1336*77e5bcceSSpandan Das
1337*77e5bcceSSpandan Das-    protected void readVector(XmlPullParser parser, Vector v, PropertyInfo elementType)
1338*77e5bcceSSpandan Das-            throws IOException,
1339*77e5bcceSSpandan Das+    protected void readVector(XmlPullParser parser, Vector v, PropertyInfo elementType) throws IOException,
1340*77e5bcceSSpandan Das             XmlPullParserException {
1341*77e5bcceSSpandan Das         String namespace = null;
1342*77e5bcceSSpandan Das         String name = null;
1343*77e5bcceSSpandan Das@@ -337,14 +368,23 @@ public class SoapSerializationEnvelope extends SoapEnvelope
1344*77e5bcceSSpandan Das         parser.require(XmlPullParser.END_TAG, null, null);
1345*77e5bcceSSpandan Das     }
1346*77e5bcceSSpandan Das
1347*77e5bcceSSpandan Das+    /**
1348*77e5bcceSSpandan Das+     * This method returns id from the href attribute value.
1349*77e5bcceSSpandan Das+     * By default we assume that href value looks like this: #id so we basically have to remove the first character.
1350*77e5bcceSSpandan Das+     * But in theory there could be a different value format, like cid:value, etc...
1351*77e5bcceSSpandan Das+     */
1352*77e5bcceSSpandan Das+    protected String getIdFromHref(String hrefValue) {
1353*77e5bcceSSpandan Das+        return hrefValue.substring(1);
1354*77e5bcceSSpandan Das+    }
1355*77e5bcceSSpandan Das+
1356*77e5bcceSSpandan Das     /**
1357*77e5bcceSSpandan Das      * Builds an object from the XML stream. This method is public for usage in conjuction with Marshal
1358*77e5bcceSSpandan Das      * subclasses. Precondition: On the start tag of the object or property, so href can be read.
1359*77e5bcceSSpandan Das      */
1360*77e5bcceSSpandan Das
1361*77e5bcceSSpandan Das-    public Object read(XmlPullParser parser, Object owner, int index, String namespace,
1362*77e5bcceSSpandan Das-            String name,
1363*77e5bcceSSpandan Das-            PropertyInfo expected) throws IOException, XmlPullParserException {
1364*77e5bcceSSpandan Das+    public Object read(XmlPullParser parser, Object owner, int index, String namespace, String name,
1365*77e5bcceSSpandan Das+            PropertyInfo expected)
1366*77e5bcceSSpandan Das+            throws IOException, XmlPullParserException {
1367*77e5bcceSSpandan Das         String elementName = parser.getName();
1368*77e5bcceSSpandan Das         String href = parser.getAttributeValue(null, HREF_LABEL);
1369*77e5bcceSSpandan Das         Object obj;
1370*77e5bcceSSpandan Das@@ -352,7 +392,7 @@ public class SoapSerializationEnvelope extends SoapEnvelope
1371*77e5bcceSSpandan Das             if (owner == null) {
1372*77e5bcceSSpandan Das                 throw new RuntimeException("href at root level?!?");
1373*77e5bcceSSpandan Das             }
1374*77e5bcceSSpandan Das-            href = href.substring(1);
1375*77e5bcceSSpandan Das+            href = getIdFromHref(href);
1376*77e5bcceSSpandan Das             obj = idMap.get(href);
1377*77e5bcceSSpandan Das             if (obj == null || obj instanceof FwdRef) {
1378*77e5bcceSSpandan Das                 FwdRef f = new FwdRef();
1379*77e5bcceSSpandan Das@@ -402,21 +442,8 @@ public class SoapSerializationEnvelope extends SoapEnvelope
1380*77e5bcceSSpandan Das             }
1381*77e5bcceSSpandan Das             // finally, care about the id....
1382*77e5bcceSSpandan Das             if (id != null) {
1383*77e5bcceSSpandan Das-                Object hlp = idMap.get(id);
1384*77e5bcceSSpandan Das-                if (hlp instanceof FwdRef) {
1385*77e5bcceSSpandan Das-                    FwdRef f = (FwdRef) hlp;
1386*77e5bcceSSpandan Das-                    do {
1387*77e5bcceSSpandan Das-                        if (f.obj instanceof KvmSerializable) {
1388*77e5bcceSSpandan Das-                            ((KvmSerializable) f.obj).setProperty(f.index, obj);
1389*77e5bcceSSpandan Das-                        } else {
1390*77e5bcceSSpandan Das-                            ((Vector) f.obj).setElementAt(obj, f.index);
1391*77e5bcceSSpandan Das-                        }
1392*77e5bcceSSpandan Das-                        f = f.next;
1393*77e5bcceSSpandan Das-                    } while (f != null);
1394*77e5bcceSSpandan Das-                } else if (hlp != null) {
1395*77e5bcceSSpandan Das-                    throw new RuntimeException("double ID");
1396*77e5bcceSSpandan Das-                }
1397*77e5bcceSSpandan Das-                idMap.put(id, obj);
1398*77e5bcceSSpandan Das+                resolveReference(id, obj);
1399*77e5bcceSSpandan Das+
1400*77e5bcceSSpandan Das             }
1401*77e5bcceSSpandan Das         }
1402*77e5bcceSSpandan Das
1403*77e5bcceSSpandan Das@@ -424,12 +451,30 @@ public class SoapSerializationEnvelope extends SoapEnvelope
1404*77e5bcceSSpandan Das         return obj;
1405*77e5bcceSSpandan Das     }
1406*77e5bcceSSpandan Das
1407*77e5bcceSSpandan Das+    protected void resolveReference(String id, Object obj) {
1408*77e5bcceSSpandan Das+        Object hlp = idMap.get(id);
1409*77e5bcceSSpandan Das+        if (hlp instanceof FwdRef) {
1410*77e5bcceSSpandan Das+            FwdRef f = (FwdRef) hlp;
1411*77e5bcceSSpandan Das+            do {
1412*77e5bcceSSpandan Das+                if (f.obj instanceof KvmSerializable) {
1413*77e5bcceSSpandan Das+                    ((KvmSerializable) f.obj).setProperty(f.index, obj);
1414*77e5bcceSSpandan Das+                } else {
1415*77e5bcceSSpandan Das+                    ((Vector) f.obj).setElementAt(obj, f.index);
1416*77e5bcceSSpandan Das+                }
1417*77e5bcceSSpandan Das+                f = f.next;
1418*77e5bcceSSpandan Das+            }
1419*77e5bcceSSpandan Das+            while (f != null);
1420*77e5bcceSSpandan Das+        } else if (hlp != null) {
1421*77e5bcceSSpandan Das+            throw new RuntimeException("double ID");
1422*77e5bcceSSpandan Das+        }
1423*77e5bcceSSpandan Das+        idMap.put(id, obj);
1424*77e5bcceSSpandan Das+    }
1425*77e5bcceSSpandan Das+
1426*77e5bcceSSpandan Das     /**
1427*77e5bcceSSpandan Das      * Returns a new object read from the given parser. If no mapping is found, null is returned. This method
1428*77e5bcceSSpandan Das      * is used by the SoapParser in order to convert the XML code to Java objects.
1429*77e5bcceSSpandan Das      */
1430*77e5bcceSSpandan Das-    public Object readInstance(XmlPullParser parser, String namespace, String name,
1431*77e5bcceSSpandan Das-            PropertyInfo expected)
1432*77e5bcceSSpandan Das+    public Object readInstance(XmlPullParser parser, String namespace, String name, PropertyInfo expected)
1433*77e5bcceSSpandan Das             throws IOException, XmlPullParserException {
1434*77e5bcceSSpandan Das         Object obj = qNameToClass.get(new SoapPrimitive(namespace, name, null));
1435*77e5bcceSSpandan Das         if (obj == null) {
1436*77e5bcceSSpandan Das@@ -448,10 +493,30 @@ public class SoapSerializationEnvelope extends SoapEnvelope
1437*77e5bcceSSpandan Das                 throw new RuntimeException(e.toString());
1438*77e5bcceSSpandan Das             }
1439*77e5bcceSSpandan Das         }
1440*77e5bcceSSpandan Das+        if (obj instanceof HasAttributes) {
1441*77e5bcceSSpandan Das+            HasAttributes soapObject = (HasAttributes) obj;
1442*77e5bcceSSpandan Das+            int cnt = parser.getAttributeCount();
1443*77e5bcceSSpandan Das+            for (int counter = 0; counter < cnt; counter++) {
1444*77e5bcceSSpandan Das+
1445*77e5bcceSSpandan Das+                AttributeInfo attributeInfo = new AttributeInfo();
1446*77e5bcceSSpandan Das+                attributeInfo.setName(parser.getAttributeName(counter));
1447*77e5bcceSSpandan Das+                attributeInfo.setValue(parser.getAttributeValue(counter));
1448*77e5bcceSSpandan Das+                attributeInfo.setNamespace(parser.getAttributeNamespace(counter));
1449*77e5bcceSSpandan Das+                attributeInfo.setType(parser.getAttributeType(counter));
1450*77e5bcceSSpandan Das+
1451*77e5bcceSSpandan Das+                soapObject.setAttribute(attributeInfo);
1452*77e5bcceSSpandan Das+
1453*77e5bcceSSpandan Das+            }
1454*77e5bcceSSpandan Das+        }
1455*77e5bcceSSpandan Das+
1456*77e5bcceSSpandan Das         // ok, obj is now the instance, fill it....
1457*77e5bcceSSpandan Das         if (obj instanceof SoapObject) {
1458*77e5bcceSSpandan Das             readSerializable(parser, (SoapObject) obj);
1459*77e5bcceSSpandan Das         } else if (obj instanceof KvmSerializable) {
1460*77e5bcceSSpandan Das+
1461*77e5bcceSSpandan Das+            if(obj instanceof HasInnerText){
1462*77e5bcceSSpandan Das+                ((HasInnerText)obj).setInnerText((parser.getText() != null) ? parser.getText() : "");
1463*77e5bcceSSpandan Das+            }
1464*77e5bcceSSpandan Das             readSerializable(parser, (KvmSerializable) obj);
1465*77e5bcceSSpandan Das         } else if (obj instanceof Vector) {
1466*77e5bcceSSpandan Das             readVector(parser, (Vector) obj, expected.elementType);
1467*77e5bcceSSpandan Das@@ -476,15 +541,11 @@ public class SoapSerializationEnvelope extends SoapEnvelope
1468*77e5bcceSSpandan Das         }
1469*77e5bcceSSpandan Das         if (type instanceof SoapObject) {
1470*77e5bcceSSpandan Das             SoapObject so = (SoapObject) type;
1471*77e5bcceSSpandan Das-            return new Object[] {
1472*77e5bcceSSpandan Das-                    so.getNamespace(), so.getName(), null, null
1473*77e5bcceSSpandan Das-            };
1474*77e5bcceSSpandan Das+            return new Object[]{so.getNamespace(), so.getName(), null, null};
1475*77e5bcceSSpandan Das         }
1476*77e5bcceSSpandan Das         if (type instanceof SoapPrimitive) {
1477*77e5bcceSSpandan Das             SoapPrimitive sp = (SoapPrimitive) type;
1478*77e5bcceSSpandan Das-            return new Object[] {
1479*77e5bcceSSpandan Das-                    sp.getNamespace(), sp.getName(), null, DEFAULT_MARSHAL
1480*77e5bcceSSpandan Das-            };
1481*77e5bcceSSpandan Das+            return new Object[]{sp.getNamespace(), sp.getName(), null, DEFAULT_MARSHAL};
1482*77e5bcceSSpandan Das         }
1483*77e5bcceSSpandan Das         if ((type instanceof Class) && type != PropertyInfo.OBJECT_CLASS) {
1484*77e5bcceSSpandan Das             Object[] tmp = (Object[]) classToQName.get(((Class) type).getName());
1485*77e5bcceSSpandan Das@@ -492,9 +553,7 @@ public class SoapSerializationEnvelope extends SoapEnvelope
1486*77e5bcceSSpandan Das                 return tmp;
1487*77e5bcceSSpandan Das             }
1488*77e5bcceSSpandan Das         }
1489*77e5bcceSSpandan Das-        return new Object[] {
1490*77e5bcceSSpandan Das-                xsd, ANY_TYPE_LABEL, null, null
1491*77e5bcceSSpandan Das-        };
1492*77e5bcceSSpandan Das+        return new Object[]{xsd, ANY_TYPE_LABEL, null, null};
1493*77e5bcceSSpandan Das     }
1494*77e5bcceSSpandan Das
1495*77e5bcceSSpandan Das     /**
1496*77e5bcceSSpandan Das@@ -503,11 +562,8 @@ public class SoapSerializationEnvelope extends SoapEnvelope
1497*77e5bcceSSpandan Das      */
1498*77e5bcceSSpandan Das     public void addMapping(String namespace, String name, Class clazz, Marshal marshal) {
1499*77e5bcceSSpandan Das         qNameToClass
1500*77e5bcceSSpandan Das-                .put(new SoapPrimitive(namespace, name, null), marshal == null ? (Object) clazz
1501*77e5bcceSSpandan Das-                        : marshal);
1502*77e5bcceSSpandan Das-        classToQName.put(clazz.getName(), new Object[] {
1503*77e5bcceSSpandan Das-                namespace, name, null, marshal
1504*77e5bcceSSpandan Das-        });
1505*77e5bcceSSpandan Das+                .put(new SoapPrimitive(namespace, name, null), marshal == null ? (Object) clazz : marshal);
1506*77e5bcceSSpandan Das+        classToQName.put(clazz.getName(), new Object[]{namespace, name, null, marshal});
1507*77e5bcceSSpandan Das     }
1508*77e5bcceSSpandan Das
1509*77e5bcceSSpandan Das     /**
1510*77e5bcceSSpandan Das@@ -528,11 +584,14 @@ public class SoapSerializationEnvelope extends SoapEnvelope
1511*77e5bcceSSpandan Das     /**
1512*77e5bcceSSpandan Das      * Response from the soap call. Pulls the object from the wrapper object and returns it.
1513*77e5bcceSSpandan Das      *
1514*77e5bcceSSpandan Das-     * @since 2.0.3
1515*77e5bcceSSpandan Das      * @return response from the soap call.
1516*77e5bcceSSpandan Das      * @throws SoapFault
1517*77e5bcceSSpandan Das+     * @since 2.0.3
1518*77e5bcceSSpandan Das      */
1519*77e5bcceSSpandan Das     public Object getResponse() throws SoapFault {
1520*77e5bcceSSpandan Das+        if (bodyIn == null) {
1521*77e5bcceSSpandan Das+            return null;
1522*77e5bcceSSpandan Das+        }
1523*77e5bcceSSpandan Das         if (bodyIn instanceof SoapFault) {
1524*77e5bcceSSpandan Das             throw (SoapFault) bodyIn;
1525*77e5bcceSSpandan Das         }
1526*77e5bcceSSpandan Das@@ -554,8 +613,7 @@ public class SoapSerializationEnvelope extends SoapEnvelope
1527*77e5bcceSSpandan Das     /**
1528*77e5bcceSSpandan Das      * Serializes the request object to the given XmlSerliazer object
1529*77e5bcceSSpandan Das      *
1530*77e5bcceSSpandan Das-     * @param writer
1531*77e5bcceSSpandan Das-     *            XmlSerializer object to write the body into.
1532*77e5bcceSSpandan Das+     * @param writer XmlSerializer object to write the body into.
1533*77e5bcceSSpandan Das      */
1534*77e5bcceSSpandan Das     public void writeBody(XmlSerializer writer) throws IOException {
1535*77e5bcceSSpandan Das         // allow an empty body without any tags in it
1536*77e5bcceSSpandan Das@@ -564,36 +622,48 @@ public class SoapSerializationEnvelope extends SoapEnvelope
1537*77e5bcceSSpandan Das             multiRef = new Vector();
1538*77e5bcceSSpandan Das             multiRef.addElement(bodyOut);
1539*77e5bcceSSpandan Das             Object[] qName = getInfo(null, bodyOut);
1540*77e5bcceSSpandan Das-            writer.startTag((dotNet) ? "" : (String) qName[QNAME_NAMESPACE],
1541*77e5bcceSSpandan Das-                    (String) qName[QNAME_TYPE]); //<spp:sppPostDevData
1542*77e5bcceSSpandan Das-            if (dotNet) {
1543*77e5bcceSSpandan Das-                writer.attribute(null, "xmlns", (String) qName[QNAME_NAMESPACE]);
1544*77e5bcceSSpandan Das-            }
1545*77e5bcceSSpandan Das+
1546*77e5bcceSSpandan Das+            writer.startTag((dotNet) ? "" : (String) qName[QNAME_NAMESPACE], (String) qName[QNAME_TYPE]);
1547*77e5bcceSSpandan Das+
1548*77e5bcceSSpandan Das+                if (dotNet) {
1549*77e5bcceSSpandan Das+                    writer.attribute(null, "xmlns", (String) qName[QNAME_NAMESPACE]);
1550*77e5bcceSSpandan Das+                }
1551*77e5bcceSSpandan Das+
1552*77e5bcceSSpandan Das             if (addAdornments) {
1553*77e5bcceSSpandan Das                 writer.attribute(null, ID_LABEL, qName[2] == null ? ("o" + 0) : (String) qName[2]);
1554*77e5bcceSSpandan Das                 writer.attribute(enc, ROOT_LABEL, "1");
1555*77e5bcceSSpandan Das             }
1556*77e5bcceSSpandan Das-            writeElement(writer, bodyOut, null, qName[QNAME_MARSHAL]); //....
1557*77e5bcceSSpandan Das-            writer.endTag((dotNet) ? "" : (String) qName[QNAME_NAMESPACE],
1558*77e5bcceSSpandan Das-                    (String) qName[QNAME_TYPE]);//</spp:sppPostDevData>
1559*77e5bcceSSpandan Das+            writeElement(writer, bodyOut, null, qName[QNAME_MARSHAL]);
1560*77e5bcceSSpandan Das+            writer.endTag((dotNet) ? "" : (String) qName[QNAME_NAMESPACE], (String) qName[QNAME_TYPE]);
1561*77e5bcceSSpandan Das         }
1562*77e5bcceSSpandan Das     }
1563*77e5bcceSSpandan Das
1564*77e5bcceSSpandan Das-    /**
1565*77e5bcceSSpandan Das-     * Writes the body of an SoapObject. This method write the attributes and then calls
1566*77e5bcceSSpandan Das-     * "writeObjectBody (writer, (KvmSerializable)obj);"
1567*77e5bcceSSpandan Das-     */
1568*77e5bcceSSpandan Das-    public void writeObjectBody(XmlSerializer writer, SoapObject obj) throws IOException {
1569*77e5bcceSSpandan Das-        SoapObject soapObject = (SoapObject) obj;
1570*77e5bcceSSpandan Das+    private void writeAttributes(XmlSerializer writer, HasAttributes obj) throws IOException {
1571*77e5bcceSSpandan Das+        HasAttributes soapObject = (HasAttributes) obj;
1572*77e5bcceSSpandan Das         int cnt = soapObject.getAttributeCount();
1573*77e5bcceSSpandan Das         for (int counter = 0; counter < cnt; counter++) {
1574*77e5bcceSSpandan Das             AttributeInfo attributeInfo = new AttributeInfo();
1575*77e5bcceSSpandan Das             soapObject.getAttributeInfo(counter, attributeInfo);
1576*77e5bcceSSpandan Das-            writer.attribute(attributeInfo.getNamespace(), attributeInfo.getName(), attributeInfo
1577*77e5bcceSSpandan Das-                    .getValue()
1578*77e5bcceSSpandan Das-                    .toString());
1579*77e5bcceSSpandan Das+            soapObject.getAttribute(counter, attributeInfo);
1580*77e5bcceSSpandan Das+            if (attributeInfo.getValue() != null) {
1581*77e5bcceSSpandan Das+                writer.attribute(attributeInfo.getNamespace(), attributeInfo.getName(),
1582*77e5bcceSSpandan Das+                        attributeInfo.getValue().toString());
1583*77e5bcceSSpandan Das+            }
1584*77e5bcceSSpandan Das+        }
1585*77e5bcceSSpandan Das+    }
1586*77e5bcceSSpandan Das+
1587*77e5bcceSSpandan Das+    public void writeArrayListBodyWithAttributes(XmlSerializer writer, KvmSerializable obj) throws IOException {
1588*77e5bcceSSpandan Das+        if (obj instanceof HasAttributes) {
1589*77e5bcceSSpandan Das+            writeAttributes(writer, (HasAttributes) obj);
1590*77e5bcceSSpandan Das         }
1591*77e5bcceSSpandan Das-        writeObjectBody(writer, (KvmSerializable) obj);
1592*77e5bcceSSpandan Das+        writeArrayListBody(writer, (ArrayList) obj);
1593*77e5bcceSSpandan Das+    }
1594*77e5bcceSSpandan Das+
1595*77e5bcceSSpandan Das+    public void writeObjectBodyWithAttributes(XmlSerializer writer, KvmSerializable obj) throws IOException {
1596*77e5bcceSSpandan Das+        if (obj instanceof HasAttributes) {
1597*77e5bcceSSpandan Das+            writeAttributes(writer, (HasAttributes) obj);
1598*77e5bcceSSpandan Das+        }
1599*77e5bcceSSpandan Das+        writeObjectBody(writer, obj);
1600*77e5bcceSSpandan Das     }
1601*77e5bcceSSpandan Das
1602*77e5bcceSSpandan Das     /**
1603*77e5bcceSSpandan Das@@ -614,9 +684,12 @@ public class SoapSerializationEnvelope extends SoapEnvelope
1604*77e5bcceSSpandan Das             if (!(prop instanceof SoapObject)) {
1605*77e5bcceSSpandan Das                 // prop is a PropertyInfo
1606*77e5bcceSSpandan Das                 if ((propertyInfo.flags & PropertyInfo.TRANSIENT) == 0) {
1607*77e5bcceSSpandan Das-                    writer.startTag(propertyInfo.namespace, propertyInfo.name);
1608*77e5bcceSSpandan Das-                    writeProperty(writer, obj.getProperty(i), propertyInfo);
1609*77e5bcceSSpandan Das-                    writer.endTag(propertyInfo.namespace, propertyInfo.name);
1610*77e5bcceSSpandan Das+                    Object objValue = obj.getProperty(i);
1611*77e5bcceSSpandan Das+                    if ((prop != null || !skipNullProperties) && (objValue != SoapPrimitive.NullSkip)) {
1612*77e5bcceSSpandan Das+                        writer.startTag(propertyInfo.namespace, propertyInfo.name);
1613*77e5bcceSSpandan Das+                        writeProperty(writer, objValue, propertyInfo);
1614*77e5bcceSSpandan Das+                        writer.endTag(propertyInfo.namespace, propertyInfo.name);
1615*77e5bcceSSpandan Das+                    }
1616*77e5bcceSSpandan Das                 }
1617*77e5bcceSSpandan Das             } else {
1618*77e5bcceSSpandan Das                 // prop is a SoapObject
1619*77e5bcceSSpandan Das@@ -633,46 +706,47 @@ public class SoapSerializationEnvelope extends SoapEnvelope
1620*77e5bcceSSpandan Das                     name = (String) qName[QNAME_TYPE];
1621*77e5bcceSSpandan Das                 }
1622*77e5bcceSSpandan Das
1623*77e5bcceSSpandan Das-                // treat MO data as CDATA
1624*77e5bcceSSpandan Das-                if (name.equals("DevInfo") || name.equals("DevDetail")
1625*77e5bcceSSpandan Das-                        || name.equals("PerProviderSubscription") || // format v4
1626*77e5bcceSSpandan Das-                        name.equals("MgmtTree") // format v6
1627*77e5bcceSSpandan Das-                ) {
1628*77e5bcceSSpandan Das-                    ByteArrayOutputStream bos = new ByteArrayOutputStream();
1629*77e5bcceSSpandan Das-                    XmlSerializer xw = new KXmlSerializer();
1630*77e5bcceSSpandan Das-                    xw.setOutput(bos, "UTF-8");
1631*77e5bcceSSpandan Das-                    xw.startTag((dotNet) ? "" : namespace, name);
1632*77e5bcceSSpandan Das-                    if (!implicitTypes) {
1633*77e5bcceSSpandan Das-                        String prefix = writer.getPrefix(namespace, true);
1634*77e5bcceSSpandan Das-                        writer.attribute(xsi, TYPE_LABEL, prefix + ":" + type);
1635*77e5bcceSSpandan Das-                    }
1636*77e5bcceSSpandan Das-                    writeObjectBody(xw, nestedSoap);
1637*77e5bcceSSpandan Das-                    xw.endTag((dotNet) ? "" : namespace, name);
1638*77e5bcceSSpandan Das-                    xw.flush();
1639*77e5bcceSSpandan Das-                    //bos.write('\r');
1640*77e5bcceSSpandan Das-                    //bos.write('\n');
1641*77e5bcceSSpandan Das-                    bos.flush();
1642*77e5bcceSSpandan Das-                    writer.cdsect(bos.toString());
1643*77e5bcceSSpandan Das+                // prefer the namespace from the property info
1644*77e5bcceSSpandan Das+                if (propertyInfo.namespace != null && propertyInfo.namespace.length() > 0) {
1645*77e5bcceSSpandan Das+                    namespace = propertyInfo.namespace;
1646*77e5bcceSSpandan Das+                } else {
1647*77e5bcceSSpandan Das+                    namespace = (String) qName[QNAME_NAMESPACE];
1648*77e5bcceSSpandan Das+                }
1649*77e5bcceSSpandan Das+
1650*77e5bcceSSpandan Das+                writer.startTag(namespace, name);
1651*77e5bcceSSpandan Das+                if (!implicitTypes) {
1652*77e5bcceSSpandan Das+                    String prefix = writer.getPrefix(namespace, true);
1653*77e5bcceSSpandan Das+                    writer.attribute(xsi, TYPE_LABEL, prefix + ":" + type);
1654*77e5bcceSSpandan Das+                }
1655*77e5bcceSSpandan Das+                writeObjectBodyWithAttributes(writer, nestedSoap);
1656*77e5bcceSSpandan Das+                writer.endTag(namespace, name);
1657*77e5bcceSSpandan Das+            }
1658*77e5bcceSSpandan Das+        }
1659*77e5bcceSSpandan Das+        writeInnerText(writer, obj);
1660*77e5bcceSSpandan Das+
1661*77e5bcceSSpandan Das+    }
1662*77e5bcceSSpandan Das+
1663*77e5bcceSSpandan Das+    private void writeInnerText(XmlSerializer writer, KvmSerializable obj) throws IOException {
1664*77e5bcceSSpandan Das+        if(obj instanceof HasInnerText){
1665*77e5bcceSSpandan Das+
1666*77e5bcceSSpandan Das+            Object value=((HasInnerText)obj).getInnerText();
1667*77e5bcceSSpandan Das+            if (value != null) {
1668*77e5bcceSSpandan Das+                if(value instanceof ValueWriter)
1669*77e5bcceSSpandan Das+                {
1670*77e5bcceSSpandan Das+                    ((ValueWriter)value).write(writer);
1671*77e5bcceSSpandan Das                 }
1672*77e5bcceSSpandan Das                 else
1673*77e5bcceSSpandan Das                 {
1674*77e5bcceSSpandan Das-                    writer.startTag((dotNet) ? "" : namespace, name);
1675*77e5bcceSSpandan Das-                    if (!implicitTypes) {
1676*77e5bcceSSpandan Das-                        String prefix = writer.getPrefix(namespace, true);
1677*77e5bcceSSpandan Das-                        writer.attribute(xsi, TYPE_LABEL, prefix + ":" + type);
1678*77e5bcceSSpandan Das-                    }
1679*77e5bcceSSpandan Das-                    writeObjectBody(writer, nestedSoap);
1680*77e5bcceSSpandan Das-                    writer.endTag((dotNet) ? "" : namespace, name);
1681*77e5bcceSSpandan Das+                    writer.cdsect(value.toString());
1682*77e5bcceSSpandan Das                 }
1683*77e5bcceSSpandan Das+
1684*77e5bcceSSpandan Das             }
1685*77e5bcceSSpandan Das         }
1686*77e5bcceSSpandan Das     }
1687*77e5bcceSSpandan Das
1688*77e5bcceSSpandan Das-    protected void writeProperty(XmlSerializer writer, Object obj, PropertyInfo type)
1689*77e5bcceSSpandan Das-            throws IOException {
1690*77e5bcceSSpandan Das-        if (obj == null) {
1691*77e5bcceSSpandan Das-            ///M: Modify for HS20
1692*77e5bcceSSpandan Das-            //writer.attribute(xsi, version >= VER12 ? NIL_LABEL : NULL_LABEL, "true");
1693*77e5bcceSSpandan Das+    protected void writeProperty(XmlSerializer writer, Object obj, PropertyInfo type) throws IOException {
1694*77e5bcceSSpandan Das+        if (obj == null || obj == SoapPrimitive.NullNilElement) {
1695*77e5bcceSSpandan Das+            writer.attribute(xsi, version >= VER12 ? NIL_LABEL : NULL_LABEL, "true");
1696*77e5bcceSSpandan Das             return;
1697*77e5bcceSSpandan Das         }
1698*77e5bcceSSpandan Das         Object[] qName = getInfo(null, obj);
1699*77e5bcceSSpandan Das@@ -692,15 +766,19 @@ public class SoapSerializationEnvelope extends SoapEnvelope
1700*77e5bcceSSpandan Das         }
1701*77e5bcceSSpandan Das     }
1702*77e5bcceSSpandan Das
1703*77e5bcceSSpandan Das-    private void writeElement(XmlSerializer writer, Object element, PropertyInfo type,
1704*77e5bcceSSpandan Das-            Object marshal)
1705*77e5bcceSSpandan Das+    protected void writeElement(XmlSerializer writer, Object element, PropertyInfo type, Object marshal)
1706*77e5bcceSSpandan Das             throws IOException {
1707*77e5bcceSSpandan Das         if (marshal != null) {
1708*77e5bcceSSpandan Das             ((Marshal) marshal).writeInstance(writer, element);
1709*77e5bcceSSpandan Das-        } else if (element instanceof SoapObject) {
1710*77e5bcceSSpandan Das-            writeObjectBody(writer, (SoapObject) element);
1711*77e5bcceSSpandan Das-        } else if (element instanceof KvmSerializable) {
1712*77e5bcceSSpandan Das-            writeObjectBody(writer, (KvmSerializable) element);
1713*77e5bcceSSpandan Das+        } else if (element instanceof KvmSerializable || element == SoapPrimitive.NullNilElement
1714*77e5bcceSSpandan Das+                || element == SoapPrimitive.NullSkip) {
1715*77e5bcceSSpandan Das+            if (element instanceof ArrayList) {
1716*77e5bcceSSpandan Das+                writeArrayListBodyWithAttributes(writer, (KvmSerializable) element);
1717*77e5bcceSSpandan Das+            } else {
1718*77e5bcceSSpandan Das+                writeObjectBodyWithAttributes(writer, (KvmSerializable) element);
1719*77e5bcceSSpandan Das+            }
1720*77e5bcceSSpandan Das+        } else if (element instanceof HasAttributes) {
1721*77e5bcceSSpandan Das+            writeAttributes(writer, (HasAttributes) element);
1722*77e5bcceSSpandan Das         } else if (element instanceof Vector) {
1723*77e5bcceSSpandan Das             writeVectorBody(writer, (Vector) element, type.elementType);
1724*77e5bcceSSpandan Das         } else {
1725*77e5bcceSSpandan Das@@ -708,6 +786,65 @@ public class SoapSerializationEnvelope extends SoapEnvelope
1726*77e5bcceSSpandan Das         }
1727*77e5bcceSSpandan Das     }
1728*77e5bcceSSpandan Das
1729*77e5bcceSSpandan Das+    protected void writeArrayListBody(XmlSerializer writer, ArrayList list)
1730*77e5bcceSSpandan Das+            throws IOException {
1731*77e5bcceSSpandan Das+        KvmSerializable obj = (KvmSerializable) list;
1732*77e5bcceSSpandan Das+        int cnt = list.size();
1733*77e5bcceSSpandan Das+        PropertyInfo propertyInfo = new PropertyInfo();
1734*77e5bcceSSpandan Das+        String namespace;
1735*77e5bcceSSpandan Das+        String name;
1736*77e5bcceSSpandan Das+        String type;
1737*77e5bcceSSpandan Das+        for (int i = 0; i < cnt; i++) {
1738*77e5bcceSSpandan Das+            // get the property
1739*77e5bcceSSpandan Das+            Object prop = obj.getProperty(i);
1740*77e5bcceSSpandan Das+            // and importantly also get the property info which holds the name potentially!
1741*77e5bcceSSpandan Das+            obj.getPropertyInfo(i, properties, propertyInfo);
1742*77e5bcceSSpandan Das+
1743*77e5bcceSSpandan Das+            if (!(prop instanceof SoapObject)) {
1744*77e5bcceSSpandan Das+                // prop is a PropertyInfo
1745*77e5bcceSSpandan Das+                if ((propertyInfo.flags & PropertyInfo.TRANSIENT) == 0) {
1746*77e5bcceSSpandan Das+                    Object objValue = obj.getProperty(i);
1747*77e5bcceSSpandan Das+                    if ((prop != null || !skipNullProperties) && (objValue != SoapPrimitive.NullSkip)) {
1748*77e5bcceSSpandan Das+                        writer.startTag(propertyInfo.namespace, propertyInfo.name);
1749*77e5bcceSSpandan Das+                        writeProperty(writer, objValue, propertyInfo);
1750*77e5bcceSSpandan Das+                        writer.endTag(propertyInfo.namespace, propertyInfo.name);
1751*77e5bcceSSpandan Das+                    }
1752*77e5bcceSSpandan Das+                }
1753*77e5bcceSSpandan Das+            } else {
1754*77e5bcceSSpandan Das+
1755*77e5bcceSSpandan Das+                // prop is a SoapObject
1756*77e5bcceSSpandan Das+                SoapObject nestedSoap = (SoapObject) prop;
1757*77e5bcceSSpandan Das+                // lets get the info from the soap object itself
1758*77e5bcceSSpandan Das+                Object[] qName = getInfo(null, nestedSoap);
1759*77e5bcceSSpandan Das+                namespace = (String) qName[QNAME_NAMESPACE];
1760*77e5bcceSSpandan Das+                type = (String) qName[QNAME_TYPE];
1761*77e5bcceSSpandan Das+
1762*77e5bcceSSpandan Das+                // prefer the name from the property info
1763*77e5bcceSSpandan Das+                if (propertyInfo.name != null && propertyInfo.name.length() > 0) {
1764*77e5bcceSSpandan Das+                    name = propertyInfo.name;
1765*77e5bcceSSpandan Das+                } else {
1766*77e5bcceSSpandan Das+                    name = (String) qName[QNAME_TYPE];
1767*77e5bcceSSpandan Das+                }
1768*77e5bcceSSpandan Das+
1769*77e5bcceSSpandan Das+                // prefer the namespace from the property info
1770*77e5bcceSSpandan Das+                if (propertyInfo.namespace != null && propertyInfo.namespace.length() > 0) {
1771*77e5bcceSSpandan Das+                    namespace = propertyInfo.namespace;
1772*77e5bcceSSpandan Das+                } else {
1773*77e5bcceSSpandan Das+                    namespace = (String) qName[QNAME_NAMESPACE];
1774*77e5bcceSSpandan Das+                }
1775*77e5bcceSSpandan Das+
1776*77e5bcceSSpandan Das+                writer.startTag(namespace, name);
1777*77e5bcceSSpandan Das+                if (!implicitTypes) {
1778*77e5bcceSSpandan Das+                    String prefix = writer.getPrefix(namespace, true);
1779*77e5bcceSSpandan Das+                    writer.attribute(xsi, TYPE_LABEL, prefix + ":" + type);
1780*77e5bcceSSpandan Das+                }
1781*77e5bcceSSpandan Das+                writeObjectBodyWithAttributes(writer, nestedSoap);
1782*77e5bcceSSpandan Das+                writer.endTag(namespace, name);
1783*77e5bcceSSpandan Das+            }
1784*77e5bcceSSpandan Das+        }
1785*77e5bcceSSpandan Das+        writeInnerText(writer, obj);
1786*77e5bcceSSpandan Das+    }
1787*77e5bcceSSpandan Das+
1788*77e5bcceSSpandan Das     protected void writeVectorBody(XmlSerializer writer, Vector vector, PropertyInfo elementType)
1789*77e5bcceSSpandan Das             throws IOException {
1790*77e5bcceSSpandan Das         String itemsTagName = ITEM_LABEL;
1791*77e5bcceSSpandan Das@@ -727,9 +864,13 @@ public class SoapSerializationEnvelope extends SoapEnvelope
1792*77e5bcceSSpandan Das
1793*77e5bcceSSpandan Das         // This removes the arrayType attribute from the xml for arrays(required for most .Net services to work)
1794*77e5bcceSSpandan Das         if (!implicitTypes) {
1795*77e5bcceSSpandan Das-            writer.attribute(enc, ARRAY_TYPE_LABEL, writer.getPrefix((String) arrType[0], false)
1796*77e5bcceSSpandan Das-                    + ":"
1797*77e5bcceSSpandan Das+            writer.attribute(enc, ARRAY_TYPE_LABEL, writer.getPrefix((String) arrType[0], false) + ":"
1798*77e5bcceSSpandan Das                     + arrType[1] + "[" + cnt + "]");
1799*77e5bcceSSpandan Das+        } else {
1800*77e5bcceSSpandan Das+            // Get the namespace from mappings if available when arrayType is removed for .Net
1801*77e5bcceSSpandan Das+            if (itemsNamespace == null) {
1802*77e5bcceSSpandan Das+                itemsNamespace = (String) arrType[0];
1803*77e5bcceSSpandan Das+            }
1804*77e5bcceSSpandan Das         }
1805*77e5bcceSSpandan Das
1806*77e5bcceSSpandan Das         boolean skipped = false;
1807*77e5bcceSSpandan Dasdiff --git a/ksoap2-base/src/main/java/org/ksoap2/serialization/ValueWriter.java b/ksoap2-base/src/main/java/org/ksoap2/serialization/ValueWriter.java
1808*77e5bcceSSpandan Dasnew file mode 100644
1809*77e5bcceSSpandan Dasindex 0000000..fdbaa21
1810*77e5bcceSSpandan Das--- /dev/null
1811*77e5bcceSSpandan Das+++ b/ksoap2-base/src/main/java/org/ksoap2/serialization/ValueWriter.java
1812*77e5bcceSSpandan Das@@ -0,0 +1,13 @@
1813*77e5bcceSSpandan Das+package org.ksoap2.serialization;
1814*77e5bcceSSpandan Das+
1815*77e5bcceSSpandan Das+import org.xmlpull.v1.XmlSerializer;
1816*77e5bcceSSpandan Das+
1817*77e5bcceSSpandan Das+import java.io.IOException;
1818*77e5bcceSSpandan Das+
1819*77e5bcceSSpandan Das+/**
1820*77e5bcceSSpandan Das+ * Created by robocik on 2015-09-25.
1821*77e5bcceSSpandan Das+ */
1822*77e5bcceSSpandan Das+public interface ValueWriter
1823*77e5bcceSSpandan Das+{
1824*77e5bcceSSpandan Das+    void write(XmlSerializer writer) throws IOException;
1825*77e5bcceSSpandan Das+}
1826*77e5bcceSSpandan Dasdiff --git a/ksoap2-base/src/main/java/org/ksoap2/transport/ServiceConnection.java b/ksoap2-base/src/main/java/org/ksoap2/transport/ServiceConnection.java
1827*77e5bcceSSpandan Dasindex 8e14ee7..9dd3837 100644
1828*77e5bcceSSpandan Das--- a/ksoap2-base/src/main/java/org/ksoap2/transport/ServiceConnection.java
1829*77e5bcceSSpandan Das+++ b/ksoap2-base/src/main/java/org/ksoap2/transport/ServiceConnection.java
1830*77e5bcceSSpandan Das@@ -21,8 +21,10 @@
1831*77e5bcceSSpandan Das
1832*77e5bcceSSpandan Das package org.ksoap2.transport;
1833*77e5bcceSSpandan Das
1834*77e5bcceSSpandan Das+import java.io.IOException;
1835*77e5bcceSSpandan Das+import java.io.InputStream;
1836*77e5bcceSSpandan Das+import java.io.OutputStream;
1837*77e5bcceSSpandan Das import java.util.List;
1838*77e5bcceSSpandan Das-import java.io.*;
1839*77e5bcceSSpandan Das
1840*77e5bcceSSpandan Das /**
1841*77e5bcceSSpandan Das  * Interface to allow the abstraction of the raw transport information
1842*77e5bcceSSpandan Das@@ -58,6 +60,13 @@ public interface ServiceConnection {
1843*77e5bcceSSpandan Das      */
1844*77e5bcceSSpandan Das     public List getResponseProperties() throws IOException;
1845*77e5bcceSSpandan Das
1846*77e5bcceSSpandan Das+    /**
1847*77e5bcceSSpandan Das+     * Returns the numerical HTTP status to the caller
1848*77e5bcceSSpandan Das+     * @return an integer status value
1849*77e5bcceSSpandan Das+     * @throws IOException
1850*77e5bcceSSpandan Das+     */
1851*77e5bcceSSpandan Das+    public int getResponseCode() throws IOException;
1852*77e5bcceSSpandan Das+
1853*77e5bcceSSpandan Das     /**
1854*77e5bcceSSpandan Das      * Set properties on the outgoing connection.
1855*77e5bcceSSpandan Das      *
1856*77e5bcceSSpandan Das@@ -88,6 +97,8 @@ public interface ServiceConnection {
1857*77e5bcceSSpandan Das      **/
1858*77e5bcceSSpandan Das     public void setFixedLengthStreamingMode(int contentLength);
1859*77e5bcceSSpandan Das
1860*77e5bcceSSpandan Das+    public void setChunkedStreamingMode();
1861*77e5bcceSSpandan Das+
1862*77e5bcceSSpandan Das     /**
1863*77e5bcceSSpandan Das      * Open and return the outputStream to the endpoint.
1864*77e5bcceSSpandan Das      *
1865*77e5bcceSSpandan Dasdiff --git a/ksoap2-base/src/main/java/org/ksoap2/transport/Transport.java b/ksoap2-base/src/main/java/org/ksoap2/transport/Transport.java
1866*77e5bcceSSpandan Dasindex b2f6587..2f3d523 100644
1867*77e5bcceSSpandan Das--- a/ksoap2-base/src/main/java/org/ksoap2/transport/Transport.java
1868*77e5bcceSSpandan Das+++ b/ksoap2-base/src/main/java/org/ksoap2/transport/Transport.java
1869*77e5bcceSSpandan Das@@ -23,9 +23,13 @@
1870*77e5bcceSSpandan Das
1871*77e5bcceSSpandan Das package org.ksoap2.transport;
1872*77e5bcceSSpandan Das
1873*77e5bcceSSpandan Das+import java.util.HashMap;
1874*77e5bcceSSpandan Das+import java.util.Iterator;
1875*77e5bcceSSpandan Das import java.util.List;
1876*77e5bcceSSpandan Das import java.io.*;
1877*77e5bcceSSpandan Das+import java.net.MalformedURLException;
1878*77e5bcceSSpandan Das import java.net.Proxy;
1879*77e5bcceSSpandan Das+import java.net.URL;
1880*77e5bcceSSpandan Das
1881*77e5bcceSSpandan Das import org.ksoap2.*;
1882*77e5bcceSSpandan Das import org.kxml2.io.*;
1883*77e5bcceSSpandan Das@@ -40,9 +44,9 @@ import org.xmlpull.v1.*;
1884*77e5bcceSSpandan Das abstract public class Transport {
1885*77e5bcceSSpandan Das
1886*77e5bcceSSpandan Das     /**
1887*77e5bcceSSpandan Das-     * Added to enable web service interactions on the emulator
1888*77e5bcceSSpandan Das-     * to be debugged with Fiddler2 (Windows) but provides utility
1889*77e5bcceSSpandan Das-     * for other proxy requirements.
1890*77e5bcceSSpandan Das+     * Added to enable web service interactions on the emulator to be debugged
1891*77e5bcceSSpandan Das+     * with Fiddler2 (Windows) but provides utility for other proxy
1892*77e5bcceSSpandan Das+     * requirements.
1893*77e5bcceSSpandan Das      */
1894*77e5bcceSSpandan Das     protected Proxy proxy;
1895*77e5bcceSSpandan Das     protected String url;
1896*77e5bcceSSpandan Das@@ -61,6 +65,12 @@ abstract public class Transport {
1897*77e5bcceSSpandan Das
1898*77e5bcceSSpandan Das     private int bufferLength = ServiceConnection.DEFAULT_BUFFER_SIZE;
1899*77e5bcceSSpandan Das
1900*77e5bcceSSpandan Das+    private HashMap prefixes = new HashMap();
1901*77e5bcceSSpandan Das+
1902*77e5bcceSSpandan Das+    public HashMap getPrefixes() {
1903*77e5bcceSSpandan Das+        return prefixes;
1904*77e5bcceSSpandan Das+    }
1905*77e5bcceSSpandan Das+
1906*77e5bcceSSpandan Das     public Transport() {
1907*77e5bcceSSpandan Das     }
1908*77e5bcceSSpandan Das
1909*77e5bcceSSpandan Das@@ -82,9 +92,12 @@ abstract public class Transport {
1910*77e5bcceSSpandan Das     /**
1911*77e5bcceSSpandan Das      * Construct the transport object
1912*77e5bcceSSpandan Das      *
1913*77e5bcceSSpandan Das-     * @param proxy Specifies the proxy server to use for
1914*77e5bcceSSpandan Das-     * accessing the web service or <code>null</code> if a direct connection is available
1915*77e5bcceSSpandan Das-     * @param url Specifies the web service url
1916*77e5bcceSSpandan Das+     * @param proxy
1917*77e5bcceSSpandan Das+     *            Specifies the proxy server to use for accessing the web
1918*77e5bcceSSpandan Das+     *            service or <code>null</code> if a direct connection is
1919*77e5bcceSSpandan Das+     *            available
1920*77e5bcceSSpandan Das+     * @param url
1921*77e5bcceSSpandan Das+     *            Specifies the web service url
1922*77e5bcceSSpandan Das      *
1923*77e5bcceSSpandan Das      */
1924*77e5bcceSSpandan Das     public Transport(Proxy proxy, String url) {
1925*77e5bcceSSpandan Das@@ -114,23 +127,30 @@ abstract public class Transport {
1926*77e5bcceSSpandan Das         xp.setFeature(XmlPullParser.FEATURE_PROCESS_NAMESPACES, true);
1927*77e5bcceSSpandan Das         xp.setInput(is, null);
1928*77e5bcceSSpandan Das         envelope.parse(xp);
1929*77e5bcceSSpandan Das+        /*
1930*77e5bcceSSpandan Das+         * Fix memory leak when running on android in strict mode. Issue 133
1931*77e5bcceSSpandan Das+         */
1932*77e5bcceSSpandan Das+        is.close();
1933*77e5bcceSSpandan Das     }
1934*77e5bcceSSpandan Das
1935*77e5bcceSSpandan Das     /**
1936*77e5bcceSSpandan Das      * Serializes the request.
1937*77e5bcceSSpandan Das      */
1938*77e5bcceSSpandan Das-    protected byte[] createRequestData(SoapEnvelope envelope, String encoding) throws IOException {
1939*77e5bcceSSpandan Das-        System.out.println("createRequestData");
1940*77e5bcceSSpandan Das+    protected byte[] createRequestData(SoapEnvelope envelope, String encoding)
1941*77e5bcceSSpandan Das+            throws IOException {
1942*77e5bcceSSpandan Das         ByteArrayOutputStream bos = new ByteArrayOutputStream(bufferLength);
1943*77e5bcceSSpandan Das         byte result[] = null;
1944*77e5bcceSSpandan Das         bos.write(xmlVersionTag.getBytes());
1945*77e5bcceSSpandan Das-        System.out.println("bos.write");
1946*77e5bcceSSpandan Das         XmlSerializer xw = new KXmlSerializer();
1947*77e5bcceSSpandan Das-        System.out.println("new KXmlSerializer");
1948*77e5bcceSSpandan Das+
1949*77e5bcceSSpandan Das+        final Iterator keysIter = prefixes.keySet().iterator();
1950*77e5bcceSSpandan Das+
1951*77e5bcceSSpandan Das         xw.setOutput(bos, encoding);
1952*77e5bcceSSpandan Das-        System.out.println("xw.setOutput");
1953*77e5bcceSSpandan Das+        while (keysIter.hasNext()) {
1954*77e5bcceSSpandan Das+            String key = (String) keysIter.next();
1955*77e5bcceSSpandan Das+            xw.setPrefix(key, (String) prefixes.get(key));
1956*77e5bcceSSpandan Das+        }
1957*77e5bcceSSpandan Das         envelope.write(xw);
1958*77e5bcceSSpandan Das-        System.out.println("envelope.write");
1959*77e5bcceSSpandan Das         xw.flush();
1960*77e5bcceSSpandan Das         bos.write('\r');
1961*77e5bcceSSpandan Das         bos.write('\n');
1962*77e5bcceSSpandan Das@@ -138,14 +158,14 @@ abstract public class Transport {
1963*77e5bcceSSpandan Das         result = bos.toByteArray();
1964*77e5bcceSSpandan Das         xw = null;
1965*77e5bcceSSpandan Das         bos = null;
1966*77e5bcceSSpandan Das-        System.out.println("createRequestData end");
1967*77e5bcceSSpandan Das         return result;
1968*77e5bcceSSpandan Das     }
1969*77e5bcceSSpandan Das
1970*77e5bcceSSpandan Das     /**
1971*77e5bcceSSpandan Das      * Serializes the request.
1972*77e5bcceSSpandan Das      */
1973*77e5bcceSSpandan Das-    protected byte[] createRequestData(SoapEnvelope envelope) throws IOException {
1974*77e5bcceSSpandan Das+    protected byte[] createRequestData(SoapEnvelope envelope)
1975*77e5bcceSSpandan Das+            throws IOException {
1976*77e5bcceSSpandan Das         return createRequestData(envelope, null);
1977*77e5bcceSSpandan Das     }
1978*77e5bcceSSpandan Das
1979*77e5bcceSSpandan Das@@ -159,6 +179,12 @@ abstract public class Transport {
1980*77e5bcceSSpandan Das         this.url = url;
1981*77e5bcceSSpandan Das     }
1982*77e5bcceSSpandan Das
1983*77e5bcceSSpandan Das+    public String getUrl()
1984*77e5bcceSSpandan Das+    {
1985*77e5bcceSSpandan Das+        return url;
1986*77e5bcceSSpandan Das+    }
1987*77e5bcceSSpandan Das+
1988*77e5bcceSSpandan Das+
1989*77e5bcceSSpandan Das     /**
1990*77e5bcceSSpandan Das      * Sets the version tag for the outgoing soap call. Example <?xml
1991*77e5bcceSSpandan Das      * version=\"1.0\" encoding=\"UTF-8\"?>
1992*77e5bcceSSpandan Das@@ -177,57 +203,94 @@ abstract public class Transport {
1993*77e5bcceSSpandan Das     }
1994*77e5bcceSSpandan Das
1995*77e5bcceSSpandan Das     /**
1996*77e5bcceSSpandan Das-     * Perform a soap call with a given namespace and the given envelope providing
1997*77e5bcceSSpandan Das-     * any extra headers that the user requires such as cookies. Headers that are
1998*77e5bcceSSpandan Das-     * returned by the web service will be returned to the caller in the form of a
1999*77e5bcceSSpandan Das-     * <code>List</code> of <code>HeaderProperty</code> instances.
2000*77e5bcceSSpandan Das+     * Perform a soap call with a given namespace and the given envelope
2001*77e5bcceSSpandan Das+     * providing any extra headers that the user requires such as cookies.
2002*77e5bcceSSpandan Das+     * Headers that are returned by the web service will be returned to the
2003*77e5bcceSSpandan Das+     * caller in the form of a <code>List</code> of <code>HeaderProperty</code>
2004*77e5bcceSSpandan Das+     * instances.
2005*77e5bcceSSpandan Das+     *
2006*77e5bcceSSpandan Das+     * @param soapAction
2007*77e5bcceSSpandan Das+     *            the namespace with which to perform the call in.
2008*77e5bcceSSpandan Das+     * @param envelope
2009*77e5bcceSSpandan Das+     *            the envelope the contains the information for the call.
2010*77e5bcceSSpandan Das+     * @param headers
2011*77e5bcceSSpandan Das+     *            <code>List</code> of <code>HeaderProperty</code> headers to
2012*77e5bcceSSpandan Das+     *            send with the SOAP request.
2013*77e5bcceSSpandan Das+     *
2014*77e5bcceSSpandan Das+     * @return Headers returned by the web service as a <code>List</code> of
2015*77e5bcceSSpandan Das+     *         <code>HeaderProperty</code> instances.
2016*77e5bcceSSpandan Das+     */
2017*77e5bcceSSpandan Das+    abstract public List call(String soapAction, SoapEnvelope envelope,
2018*77e5bcceSSpandan Das+            List headers) throws IOException, XmlPullParserException;
2019*77e5bcceSSpandan Das+
2020*77e5bcceSSpandan Das+    /**
2021*77e5bcceSSpandan Das+     * Perform a soap call with a given namespace and the given envelope
2022*77e5bcceSSpandan Das+     * providing any extra headers that the user requires such as cookies.
2023*77e5bcceSSpandan Das+     * Headers that are returned by the web service will be returned to the
2024*77e5bcceSSpandan Das+     * caller in the form of a <code>List</code> of <code>HeaderProperty</code>
2025*77e5bcceSSpandan Das+     * instances.
2026*77e5bcceSSpandan Das      *
2027*77e5bcceSSpandan Das-     * @param targetNamespace
2028*77e5bcceSSpandan Das+     * @param soapAction
2029*77e5bcceSSpandan Das      *            the namespace with which to perform the call in.
2030*77e5bcceSSpandan Das      * @param envelope
2031*77e5bcceSSpandan Das      *            the envelope the contains the information for the call.
2032*77e5bcceSSpandan Das      * @param headers
2033*77e5bcceSSpandan Das-     *   <code>List</code> of <code>HeaderProperty</code> headers to send with the SOAP request.
2034*77e5bcceSSpandan Das+     *            <code>List</code> of <code>HeaderProperty</code> headers to
2035*77e5bcceSSpandan Das+     *            send with the SOAP request.
2036*77e5bcceSSpandan Das+     * @param outputFile
2037*77e5bcceSSpandan Das+     *            a file to stream the response into rather than parsing it,
2038*77e5bcceSSpandan Das+     *            streaming happens when file is not null
2039*77e5bcceSSpandan Das      *
2040*77e5bcceSSpandan Das      * @return Headers returned by the web service as a <code>List</code> of
2041*77e5bcceSSpandan Das-     * <code>HeaderProperty</code> instances.
2042*77e5bcceSSpandan Das+     *         <code>HeaderProperty</code> instances.
2043*77e5bcceSSpandan Das      */
2044*77e5bcceSSpandan Das-    abstract public List call(String targetNamespace, SoapEnvelope envelope, List headers)
2045*77e5bcceSSpandan Das-            throws IOException, XmlPullParserException;
2046*77e5bcceSSpandan Das+    abstract public List call(String soapAction, SoapEnvelope envelope,
2047*77e5bcceSSpandan Das+            List headers, File outputFile) throws IOException,
2048*77e5bcceSSpandan Das+            XmlPullParserException;
2049*77e5bcceSSpandan Das
2050*77e5bcceSSpandan Das     /**
2051*77e5bcceSSpandan Das      * Perform a soap call with a given namespace and the given envelope.
2052*77e5bcceSSpandan Das      *
2053*77e5bcceSSpandan Das-     * @param targetNamespace
2054*77e5bcceSSpandan Das+     * @param soapAction
2055*77e5bcceSSpandan Das      *            the namespace with which to perform the call in.
2056*77e5bcceSSpandan Das      * @param envelope
2057*77e5bcceSSpandan Das      *            the envelope the contains the information for the call.
2058*77e5bcceSSpandan Das      */
2059*77e5bcceSSpandan Das-    public void call(String targetNamespace, SoapEnvelope envelope) throws IOException,
2060*77e5bcceSSpandan Das-            XmlPullParserException {
2061*77e5bcceSSpandan Das-        call(targetNamespace, envelope, null);
2062*77e5bcceSSpandan Das+    public void call(String soapAction, SoapEnvelope envelope)
2063*77e5bcceSSpandan Das+            throws IOException, XmlPullParserException {
2064*77e5bcceSSpandan Das+        call(soapAction, envelope, null);
2065*77e5bcceSSpandan Das     }
2066*77e5bcceSSpandan Das
2067*77e5bcceSSpandan Das     /**
2068*77e5bcceSSpandan Das      * Return the name of the host that is specified as the web service target
2069*77e5bcceSSpandan Das-     *
2070*77e5bcceSSpandan Das+     *
2071*77e5bcceSSpandan Das      * @return Host name
2072*77e5bcceSSpandan Das      */
2073*77e5bcceSSpandan Das-    abstract public String getHost();
2074*77e5bcceSSpandan Das+    public String getHost() throws MalformedURLException {
2075*77e5bcceSSpandan Das+
2076*77e5bcceSSpandan Das+        return new URL(url).getHost();
2077*77e5bcceSSpandan Das+    }
2078*77e5bcceSSpandan Das
2079*77e5bcceSSpandan Das     /**
2080*77e5bcceSSpandan Das-     * Return the port number of the host that is specified as the web service target
2081*77e5bcceSSpandan Das-     *
2082*77e5bcceSSpandan Das+     * Return the port number of the host that is specified as the web service
2083*77e5bcceSSpandan Das+     * target
2084*77e5bcceSSpandan Das+     *
2085*77e5bcceSSpandan Das      * @return Port number
2086*77e5bcceSSpandan Das      */
2087*77e5bcceSSpandan Das-    abstract public int getPort();
2088*77e5bcceSSpandan Das+    public int getPort() throws MalformedURLException {
2089*77e5bcceSSpandan Das+
2090*77e5bcceSSpandan Das+        return new URL(url).getPort();
2091*77e5bcceSSpandan Das+    }
2092*77e5bcceSSpandan Das
2093*77e5bcceSSpandan Das     /**
2094*77e5bcceSSpandan Das      * Return the path to the web service target
2095*77e5bcceSSpandan Das-     *
2096*77e5bcceSSpandan Das+     *
2097*77e5bcceSSpandan Das      * @return The URL's path
2098*77e5bcceSSpandan Das      */
2099*77e5bcceSSpandan Das-    abstract public String getPath();
2100*77e5bcceSSpandan Das+    public String getPath() throws MalformedURLException {
2101*77e5bcceSSpandan Das+
2102*77e5bcceSSpandan Das+        return new URL(url).getPath();
2103*77e5bcceSSpandan Das+    }
2104*77e5bcceSSpandan Das
2105*77e5bcceSSpandan Das     abstract public ServiceConnection getServiceConnection() throws IOException;
2106*77e5bcceSSpandan Das }
2107*77e5bcceSSpandan Dasdiff --git a/ksoap2-j2se/src/main/java/org/ksoap2/serialization/MarshalFloat.java b/ksoap2-j2se/src/main/java/org/ksoap2/serialization/MarshalFloat.java
2108*77e5bcceSSpandan Dasindex 71c8caa..61a5e2c 100644
2109*77e5bcceSSpandan Das--- a/ksoap2-j2se/src/main/java/org/ksoap2/serialization/MarshalFloat.java
2110*77e5bcceSSpandan Das+++ b/ksoap2-j2se/src/main/java/org/ksoap2/serialization/MarshalFloat.java
2111*77e5bcceSSpandan Das@@ -27,8 +27,7 @@ import org.xmlpull.v1.*;
2112*77e5bcceSSpandan Das
2113*77e5bcceSSpandan Das public class MarshalFloat implements Marshal {
2114*77e5bcceSSpandan Das
2115*77e5bcceSSpandan Das-    public Object readInstance(XmlPullParser parser, String namespace, String name,
2116*77e5bcceSSpandan Das-            PropertyInfo propertyInfo)
2117*77e5bcceSSpandan Das+    public Object readInstance(XmlPullParser parser, String namespace, String name, PropertyInfo propertyInfo)
2118*77e5bcceSSpandan Das             throws IOException, XmlPullParserException {
2119*77e5bcceSSpandan Das         String stringValue = parser.nextText();
2120*77e5bcceSSpandan Das         Object result;
2121*77e5bcceSSpandan Dasdiff --git a/ksoap2-j2se/src/main/java/org/ksoap2/transport/HttpResponseException.java b/ksoap2-j2se/src/main/java/org/ksoap2/transport/HttpResponseException.java
2122*77e5bcceSSpandan Dasnew file mode 100644
2123*77e5bcceSSpandan Dasindex 0000000..f7fb866
2124*77e5bcceSSpandan Das--- /dev/null
2125*77e5bcceSSpandan Das+++ b/ksoap2-j2se/src/main/java/org/ksoap2/transport/HttpResponseException.java
2126*77e5bcceSSpandan Das@@ -0,0 +1,60 @@
2127*77e5bcceSSpandan Das+package org.ksoap2.transport;
2128*77e5bcceSSpandan Das+
2129*77e5bcceSSpandan Das+import java.io.IOException;
2130*77e5bcceSSpandan Das+import java.util.List;
2131*77e5bcceSSpandan Das+
2132*77e5bcceSSpandan Das+/**
2133*77e5bcceSSpandan Das+ * HttpResponseException is an IOException that is to be thrown when a Http response code is different from 200.
2134*77e5bcceSSpandan Das+ * It allows for easier retrieval of the Http response code from the connection.
2135*77e5bcceSSpandan Das+ *
2136*77e5bcceSSpandan Das+ * @author Rui Pereira <[email protected]>
2137*77e5bcceSSpandan Das+ */
2138*77e5bcceSSpandan Das+public class HttpResponseException extends IOException {
2139*77e5bcceSSpandan Das+
2140*77e5bcceSSpandan Das+    private int statusCode;
2141*77e5bcceSSpandan Das+    private List responseHeaders;
2142*77e5bcceSSpandan Das+
2143*77e5bcceSSpandan Das+    public HttpResponseException(int statusCode) {
2144*77e5bcceSSpandan Das+        super();
2145*77e5bcceSSpandan Das+        this.statusCode = statusCode;
2146*77e5bcceSSpandan Das+    }
2147*77e5bcceSSpandan Das+
2148*77e5bcceSSpandan Das+    public HttpResponseException(String detailMessage, int statusCode) {
2149*77e5bcceSSpandan Das+        super(detailMessage);
2150*77e5bcceSSpandan Das+        this.statusCode = statusCode;
2151*77e5bcceSSpandan Das+    }
2152*77e5bcceSSpandan Das+
2153*77e5bcceSSpandan Das+    public HttpResponseException(String detailMessage, int statusCode,List responseHeaders) {
2154*77e5bcceSSpandan Das+        super(detailMessage);
2155*77e5bcceSSpandan Das+        this.statusCode = statusCode;
2156*77e5bcceSSpandan Das+        this.responseHeaders=responseHeaders;
2157*77e5bcceSSpandan Das+    }
2158*77e5bcceSSpandan Das+
2159*77e5bcceSSpandan Das+    public HttpResponseException(String message, Throwable cause, int statusCode) {
2160*77e5bcceSSpandan Das+        super(message, cause);
2161*77e5bcceSSpandan Das+        this.statusCode = statusCode;
2162*77e5bcceSSpandan Das+    }
2163*77e5bcceSSpandan Das+
2164*77e5bcceSSpandan Das+    public HttpResponseException(Throwable cause, int statusCode) {
2165*77e5bcceSSpandan Das+        super(cause);
2166*77e5bcceSSpandan Das+        this.statusCode = statusCode;
2167*77e5bcceSSpandan Das+    }
2168*77e5bcceSSpandan Das+
2169*77e5bcceSSpandan Das+    /**
2170*77e5bcceSSpandan Das+     * Returns the unexpected Http response code
2171*77e5bcceSSpandan Das+     *
2172*77e5bcceSSpandan Das+     * @return response code
2173*77e5bcceSSpandan Das+     */
2174*77e5bcceSSpandan Das+    public int getStatusCode() {
2175*77e5bcceSSpandan Das+        return statusCode;
2176*77e5bcceSSpandan Das+    }
2177*77e5bcceSSpandan Das+
2178*77e5bcceSSpandan Das+    /**
2179*77e5bcceSSpandan Das+     * Returns all http headers from this response
2180*77e5bcceSSpandan Das+     *
2181*77e5bcceSSpandan Das+     * @return response code
2182*77e5bcceSSpandan Das+     */
2183*77e5bcceSSpandan Das+    public List getResponseHeaders() {
2184*77e5bcceSSpandan Das+        return responseHeaders;
2185*77e5bcceSSpandan Das+    }
2186*77e5bcceSSpandan Das+}
2187*77e5bcceSSpandan Dasdiff --git a/ksoap2-j2se/src/main/java/org/ksoap2/transport/HttpTransportSE.java b/ksoap2-j2se/src/main/java/org/ksoap2/transport/HttpTransportSE.java
2188*77e5bcceSSpandan Dasindex d92ac09..920ca60 100644
2189*77e5bcceSSpandan Das--- a/ksoap2-j2se/src/main/java/org/ksoap2/transport/HttpTransportSE.java
2190*77e5bcceSSpandan Das+++ b/ksoap2-j2se/src/main/java/org/ksoap2/transport/HttpTransportSE.java
2191*77e5bcceSSpandan Das@@ -25,24 +25,21 @@
2192*77e5bcceSSpandan Das
2193*77e5bcceSSpandan Das package org.ksoap2.transport;
2194*77e5bcceSSpandan Das
2195*77e5bcceSSpandan Das-import java.util.List;
2196*77e5bcceSSpandan Das-import java.util.zip.GZIPInputStream;
2197*77e5bcceSSpandan Das+import org.ksoap2.HeaderProperty;
2198*77e5bcceSSpandan Das+import org.ksoap2.SoapEnvelope;
2199*77e5bcceSSpandan Das+import org.ksoap2.serialization.*;
2200*77e5bcceSSpandan Das+import org.xmlpull.v1.XmlPullParserException;
2201*77e5bcceSSpandan Das+
2202*77e5bcceSSpandan Das import java.io.*;
2203*77e5bcceSSpandan Das-import java.net.MalformedURLException;
2204*77e5bcceSSpandan Das import java.net.Proxy;
2205*77e5bcceSSpandan Das-import java.net.URL;
2206*77e5bcceSSpandan Das-
2207*77e5bcceSSpandan Das-import org.ksoap2.*;
2208*77e5bcceSSpandan Das-import org.ksoap2.serialization.SoapSerializationEnvelope;
2209*77e5bcceSSpandan Das-import org.xmlpull.v1.*;
2210*77e5bcceSSpandan Das+import java.util.*;
2211*77e5bcceSSpandan Das+import java.util.zip.GZIPInputStream;
2212*77e5bcceSSpandan Das
2213*77e5bcceSSpandan Das /**
2214*77e5bcceSSpandan Das  * A J2SE based HttpTransport layer.
2215*77e5bcceSSpandan Das  */
2216*77e5bcceSSpandan Das public class HttpTransportSE extends Transport {
2217*77e5bcceSSpandan Das
2218*77e5bcceSSpandan Das-    private ServiceConnection serviceConnection;
2219*77e5bcceSSpandan Das-
2220*77e5bcceSSpandan Das     /**
2221*77e5bcceSSpandan Das      * Creates instance of HttpTransportSE with set url
2222*77e5bcceSSpandan Das      *
2223*77e5bcceSSpandan Das@@ -107,249 +104,254 @@ public class HttpTransportSE extends Transport {
2224*77e5bcceSSpandan Das      *            the desired soapAction
2225*77e5bcceSSpandan Das      * @param envelope
2226*77e5bcceSSpandan Das      *            the envelope containing the information for the soap call.
2227*77e5bcceSSpandan Das+     * @throws HttpResponseException
2228*77e5bcceSSpandan Das      * @throws IOException
2229*77e5bcceSSpandan Das      * @throws XmlPullParserException
2230*77e5bcceSSpandan Das      */
2231*77e5bcceSSpandan Das-    public void call(String soapAction, SoapEnvelope envelope) throws IOException,
2232*77e5bcceSSpandan Das-            XmlPullParserException {
2233*77e5bcceSSpandan Das-
2234*77e5bcceSSpandan Das+    public void call(String soapAction, SoapEnvelope envelope)
2235*77e5bcceSSpandan Das+            throws HttpResponseException, IOException, XmlPullParserException {
2236*77e5bcceSSpandan Das+
2237*77e5bcceSSpandan Das         call(soapAction, envelope, null);
2238*77e5bcceSSpandan Das     }
2239*77e5bcceSSpandan Das
2240*77e5bcceSSpandan Das+    public List call(String soapAction, SoapEnvelope envelope, List headers)
2241*77e5bcceSSpandan Das+            throws HttpResponseException, IOException, XmlPullParserException {
2242*77e5bcceSSpandan Das+        return call(soapAction, envelope, headers, null);
2243*77e5bcceSSpandan Das+    }
2244*77e5bcceSSpandan Das+
2245*77e5bcceSSpandan Das     /**
2246*77e5bcceSSpandan Das-     *
2247*77e5bcceSSpandan Das-     * set the desired soapAction header field
2248*77e5bcceSSpandan Das-     *
2249*77e5bcceSSpandan Das+     * Perform a soap call with a given namespace and the given envelope providing
2250*77e5bcceSSpandan Das+     * any extra headers that the user requires such as cookies. Headers that are
2251*77e5bcceSSpandan Das+     * returned by the web service will be returned to the caller in the form of a
2252*77e5bcceSSpandan Das+     * <code>List</code> of <code>HeaderProperty</code> instances.
2253*77e5bcceSSpandan Das+     *
2254*77e5bcceSSpandan Das      * @param soapAction
2255*77e5bcceSSpandan Das-     *            the desired soapAction
2256*77e5bcceSSpandan Das+     *            the namespace with which to perform the call in.
2257*77e5bcceSSpandan Das      * @param envelope
2258*77e5bcceSSpandan Das-     *            the envelope containing the information for the soap call.
2259*77e5bcceSSpandan Das+     *            the envelope the contains the information for the call.
2260*77e5bcceSSpandan Das      * @param headers
2261*77e5bcceSSpandan Das-     *              a list of HeaderProperties to be http header properties when establishing the connection
2262*77e5bcceSSpandan Das+     *   <code>List</code> of <code>HeaderProperty</code> headers to send with the SOAP request.
2263*77e5bcceSSpandan Das+     * @param outputFile
2264*77e5bcceSSpandan Das+     *              a file to stream the response into rather than parsing it, streaming happens when file is not null
2265*77e5bcceSSpandan Das      *
2266*77e5bcceSSpandan Das-     * @return <code>CookieJar</code> with any cookies sent by the server
2267*77e5bcceSSpandan Das-     * @throws IOException
2268*77e5bcceSSpandan Das-     * @throws XmlPullParserException
2269*77e5bcceSSpandan Das+     * @return Headers returned by the web service as a <code>List</code> of
2270*77e5bcceSSpandan Das+     * <code>HeaderProperty</code> instances.
2271*77e5bcceSSpandan Das+     *
2272*77e5bcceSSpandan Das+     * @throws HttpResponseException
2273*77e5bcceSSpandan Das+     *              an IOException when Http response code is different from 200
2274*77e5bcceSSpandan Das      */
2275*77e5bcceSSpandan Das-    public List call(String soapAction, SoapEnvelope envelope, List headers)
2276*77e5bcceSSpandan Das-            throws IOException, XmlPullParserException {
2277*77e5bcceSSpandan Das+    public List call(String soapAction, SoapEnvelope envelope, List headers, File outputFile)
2278*77e5bcceSSpandan Das+        throws HttpResponseException, IOException, XmlPullParserException {
2279*77e5bcceSSpandan Das
2280*77e5bcceSSpandan Das         if (soapAction == null) {
2281*77e5bcceSSpandan Das             soapAction = "\"\"";
2282*77e5bcceSSpandan Das         }
2283*77e5bcceSSpandan Das
2284*77e5bcceSSpandan Das-        System.out.println("call action:" + soapAction);
2285*77e5bcceSSpandan Das         byte[] requestData = createRequestData(envelope, "UTF-8");
2286*77e5bcceSSpandan Das
2287*77e5bcceSSpandan Das-        if (requestData != null) {
2288*77e5bcceSSpandan Das-            requestDump = debug ? new String(requestData) : null;
2289*77e5bcceSSpandan Das-        }
2290*77e5bcceSSpandan Das-        else {
2291*77e5bcceSSpandan Das-            requestDump = null;
2292*77e5bcceSSpandan Das-        }
2293*77e5bcceSSpandan Das+        requestDump = debug ? new String(requestData) : null;
2294*77e5bcceSSpandan Das         responseDump = null;
2295*77e5bcceSSpandan Das-
2296*77e5bcceSSpandan Das-        System.out.println("requestDump:" + requestDump);
2297*77e5bcceSSpandan Das+        System.out.println("requestDump: " + requestDump);
2298*77e5bcceSSpandan Das         ServiceConnection connection = getServiceConnection();
2299*77e5bcceSSpandan Das-        System.out.println("connection:" + connection);
2300*77e5bcceSSpandan Das
2301*77e5bcceSSpandan Das         connection.setRequestProperty("User-Agent", USER_AGENT);
2302*77e5bcceSSpandan Das         // SOAPAction is not a valid header for VER12 so do not add
2303*77e5bcceSSpandan Das         // it
2304*77e5bcceSSpandan Das         // @see "http://code.google.com/p/ksoap2-android/issues/detail?id=67
2305*77e5bcceSSpandan Das-        System.out.println("envelope:" + envelope);
2306*77e5bcceSSpandan Das-        if (envelope != null) {
2307*77e5bcceSSpandan Das-            if (envelope.version != SoapSerializationEnvelope.VER12) {
2308*77e5bcceSSpandan Das-                connection.setRequestProperty("SOAPAction", soapAction);
2309*77e5bcceSSpandan Das-            }
2310*77e5bcceSSpandan Das+        if (envelope.version != SoapSerializationEnvelope.VER12) {
2311*77e5bcceSSpandan Das+            connection.setRequestProperty("SOAPAction", soapAction);
2312*77e5bcceSSpandan Das+        }
2313*77e5bcceSSpandan Das
2314*77e5bcceSSpandan Das-            if (envelope.version == SoapSerializationEnvelope.VER12) {
2315*77e5bcceSSpandan Das-                connection.setRequestProperty("Content-Type", CONTENT_TYPE_SOAP_XML_CHARSET_UTF_8);
2316*77e5bcceSSpandan Das-            } else {
2317*77e5bcceSSpandan Das-                connection.setRequestProperty("Content-Type", CONTENT_TYPE_XML_CHARSET_UTF_8);
2318*77e5bcceSSpandan Das-            }
2319*77e5bcceSSpandan Das+        if (envelope.version == SoapSerializationEnvelope.VER12) {
2320*77e5bcceSSpandan Das+            connection.setRequestProperty("Content-Type", CONTENT_TYPE_SOAP_XML_CHARSET_UTF_8);
2321*77e5bcceSSpandan Das+        } else {
2322*77e5bcceSSpandan Das+            connection.setRequestProperty("Content-Type", CONTENT_TYPE_XML_CHARSET_UTF_8);
2323*77e5bcceSSpandan Das+        }
2324*77e5bcceSSpandan Das
2325*77e5bcceSSpandan Das-            connection.setRequestProperty("Connection", "close");
2326*77e5bcceSSpandan Das-            connection.setRequestProperty("Accept-Encoding", "gzip");
2327*77e5bcceSSpandan Das-            connection.setRequestProperty("Content-Length", "" + requestData.length);
2328*77e5bcceSSpandan Das+        // this seems to cause issues so we are removing it
2329*77e5bcceSSpandan Das+        //connection.setRequestProperty("Connection", "close");
2330*77e5bcceSSpandan Das+        connection.setRequestProperty("Accept-Encoding", "gzip");
2331*77e5bcceSSpandan Das
2332*77e5bcceSSpandan Das-            //M: Retry for HTTP Authentication
2333*77e5bcceSSpandan Das-            //connection.setFixedLengthStreamingMode(requestData.length);
2334*77e5bcceSSpandan Das
2335*77e5bcceSSpandan Das-            // Pass the headers provided by the user along with the call
2336*77e5bcceSSpandan Das-            if (headers != null) {
2337*77e5bcceSSpandan Das-                for (int i = 0; i < headers.size(); i++) {
2338*77e5bcceSSpandan Das-                    HeaderProperty hp = (HeaderProperty) headers.get(i);
2339*77e5bcceSSpandan Das-                    connection.setRequestProperty(hp.getKey(), hp.getValue());
2340*77e5bcceSSpandan Das-                }
2341*77e5bcceSSpandan Das+        // Pass the headers provided by the user along with the call
2342*77e5bcceSSpandan Das+        if (headers != null) {
2343*77e5bcceSSpandan Das+            for (int i = 0; i < headers.size(); i++) {
2344*77e5bcceSSpandan Das+                HeaderProperty hp = (HeaderProperty) headers.get(i);
2345*77e5bcceSSpandan Das+                connection.setRequestProperty(hp.getKey(), hp.getValue());
2346*77e5bcceSSpandan Das             }
2347*77e5bcceSSpandan Das-
2348*77e5bcceSSpandan Das-            connection.setRequestMethod("POST");
2349*77e5bcceSSpandan Das-
2350*77e5bcceSSpandan Das-        }
2351*77e5bcceSSpandan Das-        else {
2352*77e5bcceSSpandan Das-            connection.setRequestProperty("Connection", "close");
2353*77e5bcceSSpandan Das-            connection.setRequestProperty("Accept-Encoding", "gzip");
2354*77e5bcceSSpandan Das-            connection.setRequestMethod("GET");
2355*77e5bcceSSpandan Das         }
2356*77e5bcceSSpandan Das
2357*77e5bcceSSpandan Das-        if (requestData != null) {
2358*77e5bcceSSpandan Das-            OutputStream os = connection.openOutputStream();
2359*77e5bcceSSpandan Das-
2360*77e5bcceSSpandan Das-            os.write(requestData, 0, requestData.length);
2361*77e5bcceSSpandan Das-            os.flush();
2362*77e5bcceSSpandan Das-            os.close();
2363*77e5bcceSSpandan Das-            requestData = null;
2364*77e5bcceSSpandan Das-        }
2365*77e5bcceSSpandan Das-        InputStream is;
2366*77e5bcceSSpandan Das+        connection.setRequestMethod("POST");
2367*77e5bcceSSpandan Das+        sendData(requestData, connection,envelope);
2368*77e5bcceSSpandan Das+        requestData = null;
2369*77e5bcceSSpandan Das+        InputStream is = null;
2370*77e5bcceSSpandan Das         List retHeaders = null;
2371*77e5bcceSSpandan Das+        byte[] buf = null; // To allow releasing the resource after used
2372*77e5bcceSSpandan Das+        int contentLength = 8192; // To determine the size of the response and adjust buffer size
2373*77e5bcceSSpandan Das         boolean gZippedContent = false;
2374*77e5bcceSSpandan Das-        boolean bcaCert = false;
2375*77e5bcceSSpandan Das+        boolean xmlContent = false;
2376*77e5bcceSSpandan Das+        int status = connection.getResponseCode();
2377*77e5bcceSSpandan Das
2378*77e5bcceSSpandan Das         try {
2379*77e5bcceSSpandan Das             retHeaders = connection.getResponseProperties();
2380*77e5bcceSSpandan Das-            System.out.println("[HttpTransportSE] retHeaders = " + retHeaders);
2381*77e5bcceSSpandan Das+
2382*77e5bcceSSpandan Das             for (int i = 0; i < retHeaders.size(); i++) {
2383*77e5bcceSSpandan Das-                HeaderProperty hp = (HeaderProperty) retHeaders.get(i);
2384*77e5bcceSSpandan Das+                HeaderProperty hp = (HeaderProperty)retHeaders.get(i);
2385*77e5bcceSSpandan Das                 // HTTP response code has null key
2386*77e5bcceSSpandan Das                 if (null == hp.getKey()) {
2387*77e5bcceSSpandan Das                     continue;
2388*77e5bcceSSpandan Das                 }
2389*77e5bcceSSpandan Das+
2390*77e5bcceSSpandan Das+                // If we know the size of the response, we should use the size to initiate vars
2391*77e5bcceSSpandan Das+                if (hp.getKey().equalsIgnoreCase("content-length") ) {
2392*77e5bcceSSpandan Das+                    if ( hp.getValue() != null ) {
2393*77e5bcceSSpandan Das+                        try {
2394*77e5bcceSSpandan Das+                            contentLength = Integer.parseInt( hp.getValue() );
2395*77e5bcceSSpandan Das+                        } catch ( NumberFormatException nfe ) {
2396*77e5bcceSSpandan Das+                            contentLength = 8192;
2397*77e5bcceSSpandan Das+                        }
2398*77e5bcceSSpandan Das+                    }
2399*77e5bcceSSpandan Das+                }
2400*77e5bcceSSpandan Das+
2401*77e5bcceSSpandan Das+
2402*77e5bcceSSpandan Das+                // Check the content-type header to see if we're getting back XML, in case of a
2403*77e5bcceSSpandan Das+                // SOAP fault on 500 codes
2404*77e5bcceSSpandan Das+                if (hp.getKey().equalsIgnoreCase("Content-Type")
2405*77e5bcceSSpandan Das+                        && hp.getValue().contains("xml")) {
2406*77e5bcceSSpandan Das+                    xmlContent = true;
2407*77e5bcceSSpandan Das+                }
2408*77e5bcceSSpandan Das+
2409*77e5bcceSSpandan Das+
2410*77e5bcceSSpandan Das                 // ignoring case since users found that all smaller case is used on some server
2411*77e5bcceSSpandan Das                 // and even if it is wrong according to spec, we rather have it work..
2412*77e5bcceSSpandan Das                 if (hp.getKey().equalsIgnoreCase("Content-Encoding")
2413*77e5bcceSSpandan Das-                        && hp.getValue().equalsIgnoreCase("gzip")) {
2414*77e5bcceSSpandan Das+                     && hp.getValue().equalsIgnoreCase("gzip")) {
2415*77e5bcceSSpandan Das                     gZippedContent = true;
2416*77e5bcceSSpandan Das                 }
2417*77e5bcceSSpandan Das             }
2418*77e5bcceSSpandan Das-            if (gZippedContent) {
2419*77e5bcceSSpandan Das-                is = getUnZippedInputStream(connection.openInputStream());
2420*77e5bcceSSpandan Das-            } else {
2421*77e5bcceSSpandan Das-                is = connection.openInputStream();
2422*77e5bcceSSpandan Das-            }
2423*77e5bcceSSpandan Das-        } catch (IOException e) {
2424*77e5bcceSSpandan Das-            if (gZippedContent) {
2425*77e5bcceSSpandan Das-                is = getUnZippedInputStream(connection.getErrorStream());
2426*77e5bcceSSpandan Das-            } else {
2427*77e5bcceSSpandan Das-                is = connection.getErrorStream();
2428*77e5bcceSSpandan Das-            }
2429*77e5bcceSSpandan Das
2430*77e5bcceSSpandan Das-            if (is == null) {
2431*77e5bcceSSpandan Das-                connection.disconnect();
2432*77e5bcceSSpandan Das-                throw (e);
2433*77e5bcceSSpandan Das+            //first check the response code....
2434*77e5bcceSSpandan Das+            if (status != 200 && status != 202) {
2435*77e5bcceSSpandan Das+                //202 is a correct status returned by WCF OneWay operation
2436*77e5bcceSSpandan Das+                throw new HttpResponseException("HTTP request failed, HTTP status: " + status, status,retHeaders);
2437*77e5bcceSSpandan Das             }
2438*77e5bcceSSpandan Das-        }
2439*77e5bcceSSpandan Das-
2440*77e5bcceSSpandan Das-        if (debug) {
2441*77e5bcceSSpandan Das-            ByteArrayOutputStream bos = new ByteArrayOutputStream();
2442*77e5bcceSSpandan Das-            byte[] buf = new byte[8192];
2443*77e5bcceSSpandan Das
2444*77e5bcceSSpandan Das-            while (true) {
2445*77e5bcceSSpandan Das-                int rd = is.read(buf, 0, 8192);
2446*77e5bcceSSpandan Das-                if (rd == -1) {
2447*77e5bcceSSpandan Das-                    break;
2448*77e5bcceSSpandan Das+            if (contentLength > 0) {
2449*77e5bcceSSpandan Das+                if (gZippedContent) {
2450*77e5bcceSSpandan Das+                    is = getUnZippedInputStream(
2451*77e5bcceSSpandan Das+                            new BufferedInputStream(connection.openInputStream(),contentLength));
2452*77e5bcceSSpandan Das+                } else {
2453*77e5bcceSSpandan Das+                    is = new BufferedInputStream(connection.openInputStream(),contentLength);
2454*77e5bcceSSpandan Das+                }
2455*77e5bcceSSpandan Das+            }
2456*77e5bcceSSpandan Das+        } catch (IOException e) {
2457*77e5bcceSSpandan Das+            if (contentLength > 0) {
2458*77e5bcceSSpandan Das+                if(gZippedContent) {
2459*77e5bcceSSpandan Das+                    is = getUnZippedInputStream(
2460*77e5bcceSSpandan Das+                            new BufferedInputStream(connection.getErrorStream(),contentLength));
2461*77e5bcceSSpandan Das+                } else {
2462*77e5bcceSSpandan Das+                    is = new BufferedInputStream(connection.getErrorStream(),contentLength);
2463*77e5bcceSSpandan Das                 }
2464*77e5bcceSSpandan Das-                bos.write(buf, 0, rd);
2465*77e5bcceSSpandan Das             }
2466*77e5bcceSSpandan Das
2467*77e5bcceSSpandan Das-            bos.flush();
2468*77e5bcceSSpandan Das-            buf = bos.toByteArray();
2469*77e5bcceSSpandan Das+            if ( e instanceof HttpResponseException) {
2470*77e5bcceSSpandan Das+                if (!xmlContent) {
2471*77e5bcceSSpandan Das+                    if (debug && is != null) {
2472*77e5bcceSSpandan Das+                        //go ahead and read the error stream into the debug buffers/file if needed.
2473*77e5bcceSSpandan Das+                        readDebug(is, contentLength, outputFile);
2474*77e5bcceSSpandan Das+                    }
2475*77e5bcceSSpandan Das
2476*77e5bcceSSpandan Das-            responseDump = new String(buf);
2477*77e5bcceSSpandan Das+                    //we never want to drop through to attempting to parse the HTTP error stream as a SOAP response.
2478*77e5bcceSSpandan Das+                    connection.disconnect();
2479*77e5bcceSSpandan Das+                    throw e;
2480*77e5bcceSSpandan Das+                }
2481*77e5bcceSSpandan Das+            }
2482*77e5bcceSSpandan Das+        }
2483*77e5bcceSSpandan Das
2484*77e5bcceSSpandan Das-            System.out.println("responseDump:" + responseDump);
2485*77e5bcceSSpandan Das-            is.close();
2486*77e5bcceSSpandan Das-            is = new ByteArrayInputStream(buf);
2487*77e5bcceSSpandan Das+        if (debug) {
2488*77e5bcceSSpandan Das+            is = readDebug(is, contentLength, outputFile);
2489*77e5bcceSSpandan Das         }
2490*77e5bcceSSpandan Das
2491*77e5bcceSSpandan Das-        if (envelope != null) {
2492*77e5bcceSSpandan Das-            parseResponse(envelope, is);
2493*77e5bcceSSpandan Das+        if(is!=null)
2494*77e5bcceSSpandan Das+        {
2495*77e5bcceSSpandan Das+            parseResponse(envelope, is,retHeaders);
2496*77e5bcceSSpandan Das         }
2497*77e5bcceSSpandan Das
2498*77e5bcceSSpandan Das+        // release all resources
2499*77e5bcceSSpandan Das+        // input stream is will be released inside parseResponse
2500*77e5bcceSSpandan Das+        is = null;
2501*77e5bcceSSpandan Das+        buf = null;
2502*77e5bcceSSpandan Das+        //This fixes Issue 173 read my explanation here: https://code.google.com/p/ksoap2-android/issues/detail?id=173
2503*77e5bcceSSpandan Das+        connection.disconnect();
2504*77e5bcceSSpandan Das+        connection = null;
2505*77e5bcceSSpandan Das         return retHeaders;
2506*77e5bcceSSpandan Das     }
2507*77e5bcceSSpandan Das
2508*77e5bcceSSpandan Das-    private InputStream getUnZippedInputStream(InputStream inputStream) throws IOException {
2509*77e5bcceSSpandan Das-        /* workaround for Android 2.3
2510*77e5bcceSSpandan Das-           (see http://stackoverflow.com/questions/5131016/)
2511*77e5bcceSSpandan Das-        */
2512*77e5bcceSSpandan Das-        try {
2513*77e5bcceSSpandan Das-            return (GZIPInputStream) inputStream;
2514*77e5bcceSSpandan Das-        } catch (ClassCastException e) {
2515*77e5bcceSSpandan Das-            return new GZIPInputStream(inputStream);
2516*77e5bcceSSpandan Das-        }
2517*77e5bcceSSpandan Das-    }
2518*77e5bcceSSpandan Das+    protected void sendData(byte[] requestData, ServiceConnection connection, SoapEnvelope envelope)
2519*77e5bcceSSpandan Das+            throws IOException
2520*77e5bcceSSpandan Das+    {
2521*77e5bcceSSpandan Das+        connection.setRequestProperty("Content-Length", "" + requestData.length);
2522*77e5bcceSSpandan Das+        connection.setFixedLengthStreamingMode(requestData.length);
2523*77e5bcceSSpandan Das
2524*77e5bcceSSpandan Das-    public ServiceConnection getServiceConnection() throws IOException {
2525*77e5bcceSSpandan Das-        if (serviceConnection == null) {
2526*77e5bcceSSpandan Das-            System.out.println("new ServiceConnectionSE:" + proxy + " " + url + " " + timeout);
2527*77e5bcceSSpandan Das-            serviceConnection = new ServiceConnectionSE(proxy, url, timeout);
2528*77e5bcceSSpandan Das-        }
2529*77e5bcceSSpandan Das-        return serviceConnection;
2530*77e5bcceSSpandan Das+        OutputStream os = connection.openOutputStream();
2531*77e5bcceSSpandan Das+        os.write(requestData, 0, requestData.length);
2532*77e5bcceSSpandan Das+        os.flush();
2533*77e5bcceSSpandan Das+        os.close();
2534*77e5bcceSSpandan Das     }
2535*77e5bcceSSpandan Das
2536*77e5bcceSSpandan Das-    public String getHost() {
2537*77e5bcceSSpandan Das-
2538*77e5bcceSSpandan Das-        String retVal = null;
2539*77e5bcceSSpandan Das-
2540*77e5bcceSSpandan Das-        try {
2541*77e5bcceSSpandan Das-            retVal = new URL(url).getHost();
2542*77e5bcceSSpandan Das-        } catch (MalformedURLException e) {
2543*77e5bcceSSpandan Das-            e.printStackTrace();
2544*77e5bcceSSpandan Das-        }
2545*77e5bcceSSpandan Das-
2546*77e5bcceSSpandan Das-        return retVal;
2547*77e5bcceSSpandan Das+    protected void parseResponse(SoapEnvelope envelope, InputStream is,List returnedHeaders)
2548*77e5bcceSSpandan Das+            throws XmlPullParserException, IOException
2549*77e5bcceSSpandan Das+    {
2550*77e5bcceSSpandan Das+        parseResponse(envelope, is);
2551*77e5bcceSSpandan Das     }
2552*77e5bcceSSpandan Das
2553*77e5bcceSSpandan Das-    public int getPort() {
2554*77e5bcceSSpandan Das-
2555*77e5bcceSSpandan Das-        int retVal = -1;
2556*77e5bcceSSpandan Das
2557*77e5bcceSSpandan Das-        try {
2558*77e5bcceSSpandan Das-            retVal = new URL(url).getPort();
2559*77e5bcceSSpandan Das-        } catch (MalformedURLException e) {
2560*77e5bcceSSpandan Das-            e.printStackTrace();
2561*77e5bcceSSpandan Das+    private InputStream readDebug(InputStream is, int contentLength, File outputFile) throws IOException {
2562*77e5bcceSSpandan Das+        OutputStream bos;
2563*77e5bcceSSpandan Das+        if (outputFile != null) {
2564*77e5bcceSSpandan Das+            bos = new FileOutputStream(outputFile);
2565*77e5bcceSSpandan Das+        } else {
2566*77e5bcceSSpandan Das+            // If known use the size if not use default value
2567*77e5bcceSSpandan Das+            bos = new ByteArrayOutputStream( (contentLength > 0 ) ? contentLength : 256*1024);
2568*77e5bcceSSpandan Das         }
2569*77e5bcceSSpandan Das
2570*77e5bcceSSpandan Das-        return retVal;
2571*77e5bcceSSpandan Das-    }
2572*77e5bcceSSpandan Das-
2573*77e5bcceSSpandan Das-    public String getPath() {
2574*77e5bcceSSpandan Das-
2575*77e5bcceSSpandan Das-        String retVal = null;
2576*77e5bcceSSpandan Das+        byte[] buf = new byte[256];
2577*77e5bcceSSpandan Das
2578*77e5bcceSSpandan Das-        try {
2579*77e5bcceSSpandan Das-            retVal = new URL(url).getPath();
2580*77e5bcceSSpandan Das-        } catch (MalformedURLException e) {
2581*77e5bcceSSpandan Das-            e.printStackTrace();
2582*77e5bcceSSpandan Das+        while (true) {
2583*77e5bcceSSpandan Das+            int rd = is.read(buf, 0, 256);
2584*77e5bcceSSpandan Das+            if (rd == -1) {
2585*77e5bcceSSpandan Das+                break;
2586*77e5bcceSSpandan Das+            }
2587*77e5bcceSSpandan Das+            bos.write(buf, 0, rd);
2588*77e5bcceSSpandan Das         }
2589*77e5bcceSSpandan Das
2590*77e5bcceSSpandan Das-        return retVal;
2591*77e5bcceSSpandan Das-    }
2592*77e5bcceSSpandan Das-
2593*77e5bcceSSpandan Das-    public String getQuery() {
2594*77e5bcceSSpandan Das-
2595*77e5bcceSSpandan Das-        String retVal = null;
2596*77e5bcceSSpandan Das-
2597*77e5bcceSSpandan Das-        try {
2598*77e5bcceSSpandan Das-            retVal = new URL(url).getQuery();
2599*77e5bcceSSpandan Das-        } catch (MalformedURLException e) {
2600*77e5bcceSSpandan Das-            e.printStackTrace();
2601*77e5bcceSSpandan Das+        bos.flush();
2602*77e5bcceSSpandan Das+        if (bos instanceof ByteArrayOutputStream) {
2603*77e5bcceSSpandan Das+            buf = ((ByteArrayOutputStream) bos).toByteArray();
2604*77e5bcceSSpandan Das+        }
2605*77e5bcceSSpandan Das+        bos = null;
2606*77e5bcceSSpandan Das+        responseDump = new String(buf);
2607*77e5bcceSSpandan Das+        is.close();
2608*77e5bcceSSpandan Das+        System.out.println("responseDump: " + requestDump);
2609*77e5bcceSSpandan Das+        if (outputFile != null) {
2610*77e5bcceSSpandan Das+            return new FileInputStream(outputFile);
2611*77e5bcceSSpandan Das+        } else {
2612*77e5bcceSSpandan Das+            return new ByteArrayInputStream(buf);
2613*77e5bcceSSpandan Das         }
2614*77e5bcceSSpandan Das-
2615*77e5bcceSSpandan Das-        return retVal;
2616*77e5bcceSSpandan Das     }
2617*77e5bcceSSpandan Das
2618*77e5bcceSSpandan Das-    /**
2619*77e5bcceSSpandan Das-     * @hide
2620*77e5bcceSSpandan Das-     */
2621*77e5bcceSSpandan Das-    public byte[] getRequestData(SoapEnvelope envelope, String encoding) {
2622*77e5bcceSSpandan Das+    private InputStream getUnZippedInputStream(InputStream inputStream) throws IOException {
2623*77e5bcceSSpandan Das+        /* workaround for Android 2.3
2624*77e5bcceSSpandan Das+           (see http://stackoverflow.com/questions/5131016/)
2625*77e5bcceSSpandan Das+        */
2626*77e5bcceSSpandan Das         try {
2627*77e5bcceSSpandan Das-            return createRequestData(envelope, encoding);
2628*77e5bcceSSpandan Das-        } catch (Exception e) {
2629*77e5bcceSSpandan Das-            e.printStackTrace();
2630*77e5bcceSSpandan Das+            return (GZIPInputStream) inputStream;
2631*77e5bcceSSpandan Das+        } catch (ClassCastException e) {
2632*77e5bcceSSpandan Das+            return new GZIPInputStream(inputStream);
2633*77e5bcceSSpandan Das         }
2634*77e5bcceSSpandan Das+    }
2635*77e5bcceSSpandan Das
2636*77e5bcceSSpandan Das-        return null;
2637*77e5bcceSSpandan Das+    public ServiceConnection getServiceConnection() throws IOException {
2638*77e5bcceSSpandan Das+        return new ServiceConnectionSE(proxy, url, timeout);
2639*77e5bcceSSpandan Das     }
2640*77e5bcceSSpandan Das }
2641*77e5bcceSSpandan Dasdiff --git a/ksoap2-j2se/src/main/java/org/ksoap2/transport/HttpsServiceConnectionSE.java b/ksoap2-j2se/src/main/java/org/ksoap2/transport/HttpsServiceConnectionSE.java
2642*77e5bcceSSpandan Dasindex 9ad9ba9..376c7d8 100644
2643*77e5bcceSSpandan Das--- a/ksoap2-j2se/src/main/java/org/ksoap2/transport/HttpsServiceConnectionSE.java
2644*77e5bcceSSpandan Das+++ b/ksoap2-j2se/src/main/java/org/ksoap2/transport/HttpsServiceConnectionSE.java
2645*77e5bcceSSpandan Das@@ -1,21 +1,16 @@
2646*77e5bcceSSpandan Das
2647*77e5bcceSSpandan Das package org.ksoap2.transport;
2648*77e5bcceSSpandan Das
2649*77e5bcceSSpandan Das+import org.ksoap2.HeaderProperty;
2650*77e5bcceSSpandan Das+
2651*77e5bcceSSpandan Das+import javax.net.ssl.HttpsURLConnection;
2652*77e5bcceSSpandan Das+import javax.net.ssl.SSLSocketFactory;
2653*77e5bcceSSpandan Das import java.io.IOException;
2654*77e5bcceSSpandan Das import java.io.InputStream;
2655*77e5bcceSSpandan Das import java.io.OutputStream;
2656*77e5bcceSSpandan Das+import java.net.Proxy;
2657*77e5bcceSSpandan Das import java.net.URL;
2658*77e5bcceSSpandan Das-import java.util.Iterator;
2659*77e5bcceSSpandan Das-import java.util.LinkedList;
2660*77e5bcceSSpandan Das-import java.util.Map;
2661*77e5bcceSSpandan Das-import java.util.List;
2662*77e5bcceSSpandan Das-import java.util.Set;
2663*77e5bcceSSpandan Das-
2664*77e5bcceSSpandan Das-import javax.net.ssl.HostnameVerifier;
2665*77e5bcceSSpandan Das-import javax.net.ssl.SSLSocketFactory;
2666*77e5bcceSSpandan Das-import javax.net.ssl.HttpsURLConnection;
2667*77e5bcceSSpandan Das-//import com.android.okhttp.internal.http.HttpsURLConnectionImpl;
2668*77e5bcceSSpandan Das-import org.ksoap2.HeaderProperty;
2669*77e5bcceSSpandan Das+import java.util.*;
2670*77e5bcceSSpandan Das
2671*77e5bcceSSpandan Das /**
2672*77e5bcceSSpandan Das  * HttpsServiceConnectionSE is a service connection that uses a https url connection and requires explicit setting of
2673*77e5bcceSSpandan Das@@ -49,10 +44,29 @@ public class HttpsServiceConnectionSE implements ServiceConnection {
2674*77e5bcceSSpandan Das      * @param timeout the timeout for the connection in milliseconds
2675*77e5bcceSSpandan Das      * @throws IOException
2676*77e5bcceSSpandan Das      */
2677*77e5bcceSSpandan Das-    public HttpsServiceConnectionSE(String host, int port, String file,
2678*77e5bcceSSpandan Das-            int timeout) throws IOException {
2679*77e5bcceSSpandan Das-        connection = (HttpsURLConnection) new URL(HttpsTransportSE.PROTOCOL, host, port, file)
2680*77e5bcceSSpandan Das-                .openConnection();
2681*77e5bcceSSpandan Das+    public HttpsServiceConnectionSE(String host, int port, String file, int timeout) throws IOException {
2682*77e5bcceSSpandan Das+        this(null, host, port, file, timeout);
2683*77e5bcceSSpandan Das+    }
2684*77e5bcceSSpandan Das+
2685*77e5bcceSSpandan Das+    /**
2686*77e5bcceSSpandan Das+     * Create the transport with the supplied parameters.
2687*77e5bcceSSpandan Das+     * @param proxy proxy server to use
2688*77e5bcceSSpandan Das+     * @param host the name of the host e.g. webservices.somewhere.com
2689*77e5bcceSSpandan Das+     * @param port the http port to connect on
2690*77e5bcceSSpandan Das+     * @param file the path to the file on the webserver that represents the
2691*77e5bcceSSpandan Das+     * webservice e.g. /api/services/myservice.jsp
2692*77e5bcceSSpandan Das+     * @param timeout the timeout for the connection in milliseconds
2693*77e5bcceSSpandan Das+     * @throws IOException
2694*77e5bcceSSpandan Das+     */
2695*77e5bcceSSpandan Das+    public HttpsServiceConnectionSE(Proxy proxy, String host, int port, String file, int timeout) throws IOException {
2696*77e5bcceSSpandan Das+
2697*77e5bcceSSpandan Das+        if (proxy == null) {
2698*77e5bcceSSpandan Das+            connection = (HttpsURLConnection) new URL(HttpsTransportSE.PROTOCOL, host, port, file).openConnection();
2699*77e5bcceSSpandan Das+        } else {
2700*77e5bcceSSpandan Das+            connection =
2701*77e5bcceSSpandan Das+                    (HttpsURLConnection) new URL(HttpsTransportSE.PROTOCOL, host, port, file).openConnection(proxy);
2702*77e5bcceSSpandan Das+        }
2703*77e5bcceSSpandan Das+
2704*77e5bcceSSpandan Das         updateConnectionParameters(timeout);
2705*77e5bcceSSpandan Das     }
2706*77e5bcceSSpandan Das
2707*77e5bcceSSpandan Das@@ -89,6 +103,10 @@ public class HttpsServiceConnectionSE implements ServiceConnection {
2708*77e5bcceSSpandan Das         return retList;
2709*77e5bcceSSpandan Das     }
2710*77e5bcceSSpandan Das
2711*77e5bcceSSpandan Das+    public int getResponseCode() throws IOException {
2712*77e5bcceSSpandan Das+        return connection.getResponseCode();
2713*77e5bcceSSpandan Das+    }
2714*77e5bcceSSpandan Das+
2715*77e5bcceSSpandan Das     public void setRequestProperty(String key, String value) {
2716*77e5bcceSSpandan Das         connection.setRequestProperty(key, value);
2717*77e5bcceSSpandan Das     }
2718*77e5bcceSSpandan Das@@ -101,6 +119,11 @@ public class HttpsServiceConnectionSE implements ServiceConnection {
2719*77e5bcceSSpandan Das         connection.setFixedLengthStreamingMode(contentLength);
2720*77e5bcceSSpandan Das     }
2721*77e5bcceSSpandan Das
2722*77e5bcceSSpandan Das+    public void setChunkedStreamingMode() {
2723*77e5bcceSSpandan Das+        connection.setChunkedStreamingMode(0);
2724*77e5bcceSSpandan Das+    }
2725*77e5bcceSSpandan Das+
2726*77e5bcceSSpandan Das+
2727*77e5bcceSSpandan Das     public OutputStream openOutputStream() throws IOException {
2728*77e5bcceSSpandan Das         return connection.getOutputStream();
2729*77e5bcceSSpandan Das     }
2730*77e5bcceSSpandan Das@@ -128,9 +151,4 @@ public class HttpsServiceConnectionSE implements ServiceConnection {
2731*77e5bcceSSpandan Das     public void setSSLSocketFactory(SSLSocketFactory sf) {
2732*77e5bcceSSpandan Das         connection.setSSLSocketFactory(sf);
2733*77e5bcceSSpandan Das     }
2734*77e5bcceSSpandan Das-
2735*77e5bcceSSpandan Das-    public void setHostnameVerifier(HostnameVerifier v) {
2736*77e5bcceSSpandan Das-        connection.setHostnameVerifier(v);
2737*77e5bcceSSpandan Das-    }
2738*77e5bcceSSpandan Das-
2739*77e5bcceSSpandan Das }
2740*77e5bcceSSpandan Dasdiff --git a/ksoap2-j2se/src/main/java/org/ksoap2/transport/HttpsTransportSE.java b/ksoap2-j2se/src/main/java/org/ksoap2/transport/HttpsTransportSE.java
2741*77e5bcceSSpandan Dasindex d220ac9..a7d7023 100644
2742*77e5bcceSSpandan Das--- a/ksoap2-j2se/src/main/java/org/ksoap2/transport/HttpsTransportSE.java
2743*77e5bcceSSpandan Das+++ b/ksoap2-j2se/src/main/java/org/ksoap2/transport/HttpsTransportSE.java
2744*77e5bcceSSpandan Das@@ -1,8 +1,8 @@
2745*77e5bcceSSpandan Das-
2746*77e5bcceSSpandan Das package org.ksoap2.transport;
2747*77e5bcceSSpandan Das
2748*77e5bcceSSpandan Das import java.io.IOException;
2749*77e5bcceSSpandan Das import java.net.MalformedURLException;
2750*77e5bcceSSpandan Das+import java.net.Proxy;
2751*77e5bcceSSpandan Das import java.net.URL;
2752*77e5bcceSSpandan Das
2753*77e5bcceSSpandan Das /**
2754*77e5bcceSSpandan Das@@ -14,17 +14,31 @@ import java.net.URL;
2755*77e5bcceSSpandan Das public class HttpsTransportSE extends HttpTransportSE {
2756*77e5bcceSSpandan Das
2757*77e5bcceSSpandan Das     static final String PROTOCOL = "https";
2758*77e5bcceSSpandan Das+    private static final String PROTOCOL_FULL = PROTOCOL + "://";
2759*77e5bcceSSpandan Das+
2760*77e5bcceSSpandan Das+    //connection instance, used for setting the SSLSocketFactory
2761*77e5bcceSSpandan Das+    private HttpsServiceConnectionSE connection;
2762*77e5bcceSSpandan Das
2763*77e5bcceSSpandan Das-    private ServiceConnection serviceConnection = null;
2764*77e5bcceSSpandan Das-    private final String host;
2765*77e5bcceSSpandan Das-    private final int port;
2766*77e5bcceSSpandan Das-    private final String file;
2767*77e5bcceSSpandan Das-    private final int timeout;
2768*77e5bcceSSpandan Das+    protected final String host;
2769*77e5bcceSSpandan Das+    protected final int port;
2770*77e5bcceSSpandan Das+    protected final String file;
2771*77e5bcceSSpandan Das
2772*77e5bcceSSpandan Das-    public HttpsTransportSE(String host, int port, String file, int timeout) {
2773*77e5bcceSSpandan Das-        super(HttpsTransportSE.PROTOCOL + "://" + host + ":" + port + file);
2774*77e5bcceSSpandan Das-        System.out.println("Establistion connection to: " + HttpsTransportSE.PROTOCOL + "://"
2775*77e5bcceSSpandan Das-                + host + ":" + port + file);
2776*77e5bcceSSpandan Das+    public HttpsTransportSE (String host, int port, String file, int timeout) {
2777*77e5bcceSSpandan Das+        super(HttpsTransportSE.PROTOCOL_FULL + host + ":" + port + file, timeout);
2778*77e5bcceSSpandan Das+        this.host = host;
2779*77e5bcceSSpandan Das+        this.port = port;
2780*77e5bcceSSpandan Das+        this.file = file;
2781*77e5bcceSSpandan Das+    }
2782*77e5bcceSSpandan Das+
2783*77e5bcceSSpandan Das+    /**
2784*77e5bcceSSpandan Das+     * Creates instance of HttpTransportSE with set url and defines a
2785*77e5bcceSSpandan Das+     * proxy server to use to access it
2786*77e5bcceSSpandan Das+     *
2787*77e5bcceSSpandan Das+     * @param proxy
2788*77e5bcceSSpandan Das+     * Proxy information or <code>null</code> for direct access
2789*77e5bcceSSpandan Das+     */
2790*77e5bcceSSpandan Das+    public HttpsTransportSE(Proxy proxy, String host, int port, String file, int timeout) {
2791*77e5bcceSSpandan Das+        super(proxy, HttpsTransportSE.PROTOCOL_FULL + host + ":" + port + file);
2792*77e5bcceSSpandan Das         this.host = host;
2793*77e5bcceSSpandan Das         this.port = port;
2794*77e5bcceSSpandan Das         this.file = file;
2795*77e5bcceSSpandan Das@@ -37,48 +51,11 @@ public class HttpsTransportSE extends HttpTransportSE {
2796*77e5bcceSSpandan Das      */
2797*77e5bcceSSpandan Das     public ServiceConnection getServiceConnection() throws IOException
2798*77e5bcceSSpandan Das     {
2799*77e5bcceSSpandan Das-        if (serviceConnection == null) {
2800*77e5bcceSSpandan Das-            serviceConnection = new HttpsServiceConnectionSE(host, port, file, timeout);
2801*77e5bcceSSpandan Das-        }
2802*77e5bcceSSpandan Das-        return serviceConnection;
2803*77e5bcceSSpandan Das-    }
2804*77e5bcceSSpandan Das-
2805*77e5bcceSSpandan Das-    public String getHost() {
2806*77e5bcceSSpandan Das-
2807*77e5bcceSSpandan Das-        String retVal = null;
2808*77e5bcceSSpandan Das-
2809*77e5bcceSSpandan Das-        try {
2810*77e5bcceSSpandan Das-            retVal = new URL(url).getHost();
2811*77e5bcceSSpandan Das-        } catch (MalformedURLException e) {
2812*77e5bcceSSpandan Das-            e.printStackTrace();
2813*77e5bcceSSpandan Das+        if(connection != null) {
2814*77e5bcceSSpandan Das+            return connection;
2815*77e5bcceSSpandan Das+        } else {
2816*77e5bcceSSpandan Das+            connection = new HttpsServiceConnectionSE(proxy, host, port, file, timeout);
2817*77e5bcceSSpandan Das+            return connection;
2818*77e5bcceSSpandan Das         }
2819*77e5bcceSSpandan Das-
2820*77e5bcceSSpandan Das-        return retVal;
2821*77e5bcceSSpandan Das-    }
2822*77e5bcceSSpandan Das-
2823*77e5bcceSSpandan Das-    public int getPort() {
2824*77e5bcceSSpandan Das-
2825*77e5bcceSSpandan Das-        int retVal = -1;
2826*77e5bcceSSpandan Das-
2827*77e5bcceSSpandan Das-        try {
2828*77e5bcceSSpandan Das-            retVal = new URL(url).getPort();
2829*77e5bcceSSpandan Das-        } catch (MalformedURLException e) {
2830*77e5bcceSSpandan Das-            e.printStackTrace();
2831*77e5bcceSSpandan Das-        }
2832*77e5bcceSSpandan Das-
2833*77e5bcceSSpandan Das-        return retVal;
2834*77e5bcceSSpandan Das-    }
2835*77e5bcceSSpandan Das-
2836*77e5bcceSSpandan Das-    public String getPath() {
2837*77e5bcceSSpandan Das-
2838*77e5bcceSSpandan Das-        String retVal = null;
2839*77e5bcceSSpandan Das-
2840*77e5bcceSSpandan Das-        try {
2841*77e5bcceSSpandan Das-            retVal = new URL(url).getPath();
2842*77e5bcceSSpandan Das-        } catch (MalformedURLException e) {
2843*77e5bcceSSpandan Das-            e.printStackTrace();
2844*77e5bcceSSpandan Das-        }
2845*77e5bcceSSpandan Das-
2846*77e5bcceSSpandan Das-        return retVal;
2847*77e5bcceSSpandan Das     }
2848*77e5bcceSSpandan Das }
2849*77e5bcceSSpandan Dasdiff --git a/ksoap2-j2se/src/main/java/org/ksoap2/transport/KeepAliveHttpsTransportSE.java b/ksoap2-j2se/src/main/java/org/ksoap2/transport/KeepAliveHttpsTransportSE.java
2850*77e5bcceSSpandan Dasindex 287fed1..65ba582 100644
2851*77e5bcceSSpandan Das--- a/ksoap2-j2se/src/main/java/org/ksoap2/transport/KeepAliveHttpsTransportSE.java
2852*77e5bcceSSpandan Das+++ b/ksoap2-j2se/src/main/java/org/ksoap2/transport/KeepAliveHttpsTransportSE.java
2853*77e5bcceSSpandan Das@@ -24,18 +24,8 @@ import java.io.IOException;
2854*77e5bcceSSpandan Das  */
2855*77e5bcceSSpandan Das public class KeepAliveHttpsTransportSE extends HttpsTransportSE
2856*77e5bcceSSpandan Das {
2857*77e5bcceSSpandan Das-    private final String host;
2858*77e5bcceSSpandan Das-    private final int port;
2859*77e5bcceSSpandan Das-    private final String file;
2860*77e5bcceSSpandan Das-    private final int timeout;
2861*77e5bcceSSpandan Das-    private ServiceConnection serviceConnection;
2862*77e5bcceSSpandan Das-
2863*77e5bcceSSpandan Das-    public KeepAliveHttpsTransportSE(String host, int port, String file, int timeout) {
2864*77e5bcceSSpandan Das+    public KeepAliveHttpsTransportSE (String host, int port, String file, int timeout) {
2865*77e5bcceSSpandan Das         super(host, port, file, timeout);
2866*77e5bcceSSpandan Das-        this.host = host;
2867*77e5bcceSSpandan Das-        this.port = port;
2868*77e5bcceSSpandan Das-        this.file = file;
2869*77e5bcceSSpandan Das-        this.timeout = timeout;
2870*77e5bcceSSpandan Das     }
2871*77e5bcceSSpandan Das
2872*77e5bcceSSpandan Das     /**
2873*77e5bcceSSpandan Das@@ -47,11 +37,9 @@ public class KeepAliveHttpsTransportSE extends HttpsTransportSE
2874*77e5bcceSSpandan Das     //@Override
2875*77e5bcceSSpandan Das     public ServiceConnection getServiceConnection() throws IOException
2876*77e5bcceSSpandan Das     {
2877*77e5bcceSSpandan Das-        if (serviceConnection == null) {
2878*77e5bcceSSpandan Das-            serviceConnection = new HttpsServiceConnectionSEIgnoringConnectionClose(host, port,
2879*77e5bcceSSpandan Das-                    file, timeout);
2880*77e5bcceSSpandan Das-            serviceConnection.setRequestProperty("Connection", "keep-alive");
2881*77e5bcceSSpandan Das-        }
2882*77e5bcceSSpandan Das+        ServiceConnection serviceConnection =
2883*77e5bcceSSpandan Das+                new HttpsServiceConnectionSEIgnoringConnectionClose(host, port, file, timeout);
2884*77e5bcceSSpandan Das+        serviceConnection.setRequestProperty("Connection", "keep-alive");
2885*77e5bcceSSpandan Das         return serviceConnection;
2886*77e5bcceSSpandan Das     }
2887*77e5bcceSSpandan Das
2888*77e5bcceSSpandan Dasdiff --git a/ksoap2-j2se/src/main/java/org/ksoap2/transport/ServiceConnectionSE.java b/ksoap2-j2se/src/main/java/org/ksoap2/transport/ServiceConnectionSE.java
2889*77e5bcceSSpandan Dasindex 029ee9a..bfdfe11 100644
2890*77e5bcceSSpandan Das--- a/ksoap2-j2se/src/main/java/org/ksoap2/transport/ServiceConnectionSE.java
2891*77e5bcceSSpandan Das+++ b/ksoap2-j2se/src/main/java/org/ksoap2/transport/ServiceConnectionSE.java
2892*77e5bcceSSpandan Das@@ -21,16 +21,16 @@
2893*77e5bcceSSpandan Das
2894*77e5bcceSSpandan Das package org.ksoap2.transport;
2895*77e5bcceSSpandan Das
2896*77e5bcceSSpandan Das-import java.io.*;
2897*77e5bcceSSpandan Das-import java.net.*;
2898*77e5bcceSSpandan Das-import java.util.Iterator;
2899*77e5bcceSSpandan Das-import java.util.LinkedList;
2900*77e5bcceSSpandan Das-import java.util.List;
2901*77e5bcceSSpandan Das-import java.util.Map;
2902*77e5bcceSSpandan Das-import java.util.Set;
2903*77e5bcceSSpandan Das-
2904*77e5bcceSSpandan Das import org.ksoap2.HeaderProperty;
2905*77e5bcceSSpandan Das
2906*77e5bcceSSpandan Das+import java.io.IOException;
2907*77e5bcceSSpandan Das+import java.io.InputStream;
2908*77e5bcceSSpandan Das+import java.io.OutputStream;
2909*77e5bcceSSpandan Das+import java.net.HttpURLConnection;
2910*77e5bcceSSpandan Das+import java.net.Proxy;
2911*77e5bcceSSpandan Das+import java.net.URL;
2912*77e5bcceSSpandan Das+import java.util.*;
2913*77e5bcceSSpandan Das+
2914*77e5bcceSSpandan Das /**
2915*77e5bcceSSpandan Das  * Connection for J2SE environments.
2916*77e5bcceSSpandan Das  */
2917*77e5bcceSSpandan Das@@ -80,23 +80,29 @@ public class ServiceConnectionSE implements ServiceConnection {
2918*77e5bcceSSpandan Das         connection.disconnect();
2919*77e5bcceSSpandan Das     }
2920*77e5bcceSSpandan Das
2921*77e5bcceSSpandan Das-    public List getResponseProperties() {
2922*77e5bcceSSpandan Das-        Map properties = connection.getHeaderFields();
2923*77e5bcceSSpandan Das-        Set keys = properties.keySet();
2924*77e5bcceSSpandan Das+    public List getResponseProperties() throws IOException {
2925*77e5bcceSSpandan Das         List retList = new LinkedList();
2926*77e5bcceSSpandan Das
2927*77e5bcceSSpandan Das-        for (Iterator i = keys.iterator(); i.hasNext();) {
2928*77e5bcceSSpandan Das-            String key = (String) i.next();
2929*77e5bcceSSpandan Das-            List values = (List) properties.get(key);
2930*77e5bcceSSpandan Das-
2931*77e5bcceSSpandan Das-            for (int j = 0; j < values.size(); j++) {
2932*77e5bcceSSpandan Das-                retList.add(new HeaderProperty(key, (String) values.get(j)));
2933*77e5bcceSSpandan Das+        Map properties = connection.getHeaderFields();
2934*77e5bcceSSpandan Das+        if(properties != null) {
2935*77e5bcceSSpandan Das+            Set keys = properties.keySet();
2936*77e5bcceSSpandan Das+            for (Iterator i = keys.iterator(); i.hasNext();) {
2937*77e5bcceSSpandan Das+                String key = (String) i.next();
2938*77e5bcceSSpandan Das+                List values = (List) properties.get(key);
2939*77e5bcceSSpandan Das+
2940*77e5bcceSSpandan Das+                for (int j = 0; j < values.size(); j++) {
2941*77e5bcceSSpandan Das+                    retList.add(new HeaderProperty(key, (String) values.get(j)));
2942*77e5bcceSSpandan Das+                }
2943*77e5bcceSSpandan Das             }
2944*77e5bcceSSpandan Das         }
2945*77e5bcceSSpandan Das
2946*77e5bcceSSpandan Das         return retList;
2947*77e5bcceSSpandan Das     }
2948*77e5bcceSSpandan Das
2949*77e5bcceSSpandan Das+    public int getResponseCode() throws IOException {
2950*77e5bcceSSpandan Das+        return connection.getResponseCode();
2951*77e5bcceSSpandan Das+    }
2952*77e5bcceSSpandan Das+
2953*77e5bcceSSpandan Das     public void setRequestProperty(String string, String soapAction) {
2954*77e5bcceSSpandan Das         connection.setRequestProperty(string, soapAction);
2955*77e5bcceSSpandan Das     }
2956*77e5bcceSSpandan Das@@ -116,6 +122,10 @@ public class ServiceConnectionSE implements ServiceConnection {
2957*77e5bcceSSpandan Das         connection.setFixedLengthStreamingMode(contentLength);
2958*77e5bcceSSpandan Das     }
2959*77e5bcceSSpandan Das
2960*77e5bcceSSpandan Das+    public void setChunkedStreamingMode() {
2961*77e5bcceSSpandan Das+        connection.setChunkedStreamingMode(0);
2962*77e5bcceSSpandan Das+    }
2963*77e5bcceSSpandan Das+
2964*77e5bcceSSpandan Das     public OutputStream openOutputStream() throws IOException {
2965*77e5bcceSSpandan Das         return connection.getOutputStream();
2966*77e5bcceSSpandan Das     }
2967*77e5bcceSSpandan Das--
2968*77e5bcceSSpandan Das2.17.0.441.gb46fe60e1d-goog
2969*77e5bcceSSpandan Das
2970