create changelog entry
[debian/openrocket] / android / src / net / sf / openrocket / android / thrustcurve / DownloadResponseParser.java
1 package net.sf.openrocket.android.thrustcurve;\r
2 \r
3 import java.io.InputStream;\r
4 \r
5 import net.sf.openrocket.android.util.AndroidLogWrapper;\r
6 \r
7 import org.xml.sax.Attributes;\r
8 \r
9 import android.sax.Element;\r
10 import android.sax.EndElementListener;\r
11 import android.sax.EndTextElementListener;\r
12 import android.sax.RootElement;\r
13 import android.sax.StartElementListener;\r
14 import android.util.Xml;\r
15 \r
16 public class DownloadResponseParser {\r
17 \r
18         private static final String thrustcurveURI = "http://www.thrustcurve.org/2009/DownloadResponse";\r
19 \r
20         private static final String root_tag = "download-response";\r
21         private static final String results_tag = "results";\r
22         private static final String result_tag = "result";\r
23         private static final String motor_id_tag = "motor-id";\r
24         private static final String simfile_id_tag = "simfile-id";\r
25         private static final String format_tag = "format";\r
26         private static final String source_tag = "source";\r
27         private static final String license_tag = "license";\r
28         private static final String data_tag = "data";\r
29         private static final String error_tag = "error";\r
30 \r
31         public static DownloadResponse parse( InputStream in ) {\r
32 \r
33                 final DownloadResponse ret = new DownloadResponse();\r
34                 final MotorBurnFile currentMotor = new MotorBurnFile();\r
35 \r
36                 // Have a place to put the data string and format.\r
37                 // We hold on to these here, then push them into the currentMotor\r
38                 // only if it a supported filetype\r
39                 final StringHolder current_format = new StringHolder();\r
40                 final StringHolder current_data = new StringHolder();\r
41 \r
42                 RootElement rootEl = new RootElement(thrustcurveURI, root_tag);\r
43                 /*\r
44                 rootEl.setStartElementListener(\r
45                                 new StartElementListener() {\r
46                                         public void start(Attributes arg0) {\r
47                                                 AndroidLogWrapper.d(TAG,"Start Element error");\r
48                                                 ret.setError("IsError");\r
49                                         }\r
50                                 }\r
51                                 );\r
52                                 */\r
53                 Element resultsEl = rootEl.getChild( thrustcurveURI, results_tag);\r
54                 Element resultEl = resultsEl.getChild( thrustcurveURI, result_tag);\r
55                 resultEl.setStartElementListener(\r
56                                 new StartElementListener() {\r
57                                         @Override\r
58                                         public void start(Attributes arg0) {\r
59                                                 AndroidLogWrapper.d(DownloadResponseParser.class,"Start Element result");\r
60                                                 currentMotor.init();\r
61                                         }\r
62                                 }\r
63                                 );\r
64 \r
65                 resultEl.setEndElementListener(\r
66                                 new EndElementListener() {\r
67                                         @Override\r
68                                         public void end() {\r
69                                                 if ( SupportedFileTypes.isSupportedFileType(current_format.s) ) {\r
70                                                         currentMotor.setFiletype(current_format.s);\r
71                                                         String s = null;\r
72                                                         try {\r
73                                                                 s = Base64Decoder.decodeData(current_data.s);\r
74                                                         } catch ( Exception ex ) {\r
75                                                                 AndroidLogWrapper.d(DownloadResponseParser.class,"base64: " + ex.getMessage());\r
76                                                         }\r
77                                                         currentMotor.decodeFile( s );\r
78                                                         ret.add((MotorBurnFile)currentMotor.clone());\r
79                                                 }\r
80                                         }\r
81                                 }\r
82                                 );\r
83 \r
84                 resultEl.getChild(thrustcurveURI,motor_id_tag).setEndTextElementListener(\r
85                                 new EndTextElementListener() {\r
86                                         @Override\r
87                                         public void end(String arg0) {\r
88                                                 currentMotor.setMotorId(Integer.parseInt(arg0));\r
89                                         }\r
90                                 }\r
91                                 );\r
92                 resultEl.getChild(thrustcurveURI,format_tag).setEndTextElementListener(\r
93                                 new EndTextElementListener() {\r
94                                         @Override\r
95                                         public void end(String arg0) {\r
96                                                 current_format.s = arg0;\r
97                                         }\r
98                                 }\r
99                                 );\r
100                 resultEl.getChild(thrustcurveURI,data_tag).setEndTextElementListener(\r
101                                 new EndTextElementListener() {\r
102                                         @Override\r
103                                         public void end(String arg0) {\r
104                                                 current_data.s = arg0;\r
105                                         }\r
106                                 }\r
107                                 );\r
108                 try {\r
109                         Xml.parse(in, Xml.Encoding.UTF_8,  rootEl.getContentHandler());\r
110                 } catch (Exception e) {\r
111                         throw new RuntimeException(e);\r
112                 }\r
113 \r
114                 return ret;\r
115         }\r
116 \r
117         private static class StringHolder {\r
118                 public String s;\r
119         }\r
120 \r
121 }