package com.safemobile.lib; import java.io.File; import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; import java.net.HttpURLConnection; import java.net.MalformedURLException; import java.net.URL; import java.util.ArrayList; import org.xmlpull.v1.XmlPullParser; import org.xmlpull.v1.XmlPullParserException; import android.os.Environment; import android.util.Xml; import com.safemobile.lib.radio.Channel; import com.safemobile.lib.radio.Zone; public class XMLParser { private ConfigFile config; private ArrayList xmlPath; public XMLParser() { } public ArrayList getXMLPath() { // reset xmlPath xmlPath = new ArrayList(); File file[] = Environment.getExternalStorageDirectory().listFiles(); recursiveFileFind(file); return xmlPath; } public ConfigFile parseXML(InputStream input) { XmlPullParser parser = Xml.newPullParser(); ArrayList contacts = new ArrayList(); ArrayList zones = new ArrayList(); Radio radio = new Radio(); try { parser.setInput(input, null); Contact contact = null; Zone zone = null; Channel channel = null; int eventType = parser.getEventType(); boolean done = false; while (eventType != XmlPullParser.END_DOCUMENT && !done){ String name = null; switch (eventType){ // build config object on xml start case XmlPullParser.START_DOCUMENT: config = new ConfigFile(); break; // if start tag (ex. , , ) case XmlPullParser.START_TAG: name = parser.getName(); if (name.equalsIgnoreCase("contact")) { try { String section = parser.getAttributeValue(3); if(section.equalsIgnoreCase("Digital")) { /* */ contact = new Contact(0,"", 0,1,1); // get id and name for Contact contact.name = parser.getAttributeValue(0); String type = parser.getAttributeValue(1); if(type.equals("Private Call")) contact.contactType = Contact.PRIVATE; else if (type.equals("Group Call")) contact.contactType = Contact.GROUP; contact.id = Integer.parseInt(parser.getAttributeValue(2)); } else contact = null; } catch (Exception e) { SM.Exception(e.toString()); contact.id = 0; } } else if (name.equalsIgnoreCase("radio-id")) { /* 101 */ try { // get radio id radio.id = Integer.parseInt(parser.nextText()); } catch(Exception ex) { SM.Debug(ex.toString()); } } else if (name.equalsIgnoreCase("radio-ip")) { /* 192.168.10.1 */ // get radio ip radio.ip = parser.nextText(); } else if (name.equalsIgnoreCase("zone")) { /* */ zone = new Zone(); try { // set zone Id, Number and Name zone.dbID = Integer.valueOf(parser.getAttributeValue(0)); zone.id = Integer.valueOf(parser.getAttributeValue(0)); zone.ZoneName = parser.getAttributeValue(1); } catch(Exception ex) { SM.Debug(ex.toString()); } } else if(name.equalsIgnoreCase("channel")) { /* */ channel = new Channel(); try { // set channel Id, Number and Name channel.chName = parser.getAttributeValue(1); channel.dbID = Integer.valueOf(parser.getAttributeValue(0)); channel.id = Integer.valueOf(parser.getAttributeValue(0)); } catch(Exception ex) { SM.Debug(ex.toString()); } } break; // if end tag (ex. , , ) case XmlPullParser.END_TAG: name = parser.getName(); if (name.equalsIgnoreCase("contact") && contact != null) { if(contact.contactType == Contact.PRIVATE || contact.contactType == Contact.GROUP) contacts.add(contact); // add contact to Contacts list } else if (name.equalsIgnoreCase("channel")) zone.channelList.add(channel); // add channel to Channels List else if (name.equalsIgnoreCase("zone")) zones.add(zone); // add zone to Zones List else if (name.equalsIgnoreCase("configuration")) done = true; // flag finish parsing break; } eventType = parser.next(); } // add Lists to config config.contacts = contacts; config.radio = radio; // check if every zone has at least a channel and if not, create one for(Zone zn :zones) { if(zn.channelList==null || (zn.channelList!=null && zn.channelList.size()== 0)) { zn.channelList = new ArrayList(); Channel ch = new Channel(); ch.dbID = 0; ch.chName = "N/A"; ch.id = 0; zn.channelList.add(ch); } } config.zones = zones; //SM.Debug("CONFIG", config.toLongString()); } catch (XmlPullParserException e) { //e.printStackTrace(); SM.Exception(e.toString()); config = null; } catch (IOException e) { //e.printStackTrace(); SM.Exception(e.toString()); config = null; } return config; } // get files and directory for crt Directory (file1) private void recursiveFileFind(File[] crtFile){ int i = 0; String filePath=""; if(crtFile!=null) { while(i != crtFile.length) { // get absolute path for crtFile filePath = crtFile[i].getPath(); if(crtFile[i].isDirectory()){ // if crt file is a Directory get files for new file File file[] = crtFile[i].listFiles(); recursiveFileFind(file); } i++; // if crtFile path extension is xml, add to ArrayList if(filePath.substring(filePath.length()-4, filePath.length()).equalsIgnoreCase(".xml")) { xmlPath.add(filePath); } } } } public boolean downloadXMLFile(String Path) { try { //set the download URL, a url that points to a file on the internet //this is the file to be downloaded //Path = "http://www.safemobile.com/upload/codeplugs/037TMA2140.xml"; URL url = new URL(Path); //create the new connection HttpURLConnection urlConnection = (HttpURLConnection) url.openConnection(); //set up some things on the connection urlConnection.setRequestMethod("GET"); urlConnection.setDoOutput(true); //and connect! urlConnection.connect(); //set the path where we want to save the file //in this case, going to save it on the root directory of the //sd card. File SDCardRoot = Environment.getExternalStorageDirectory(); //create a new file, specifying the path, and the filename //which we want to save the file as. File file = new File(SDCardRoot,"radioConfigFile.xml"); //this will be used to write the downloaded data into the file we created FileOutputStream fileOutput = new FileOutputStream(file); //this will be used in reading the data from the internet InputStream inputStream = urlConnection.getInputStream(); //this is the total size of the file //int totalSize = urlConnection.getContentLength(); //variable to store total downloaded bytes int downloadedSize = 0; //create a buffer... byte[] buffer = new byte[1024]; int bufferLength = 0; //used to store a temporary size of the buffer //now, read through the input buffer and write the contents to the file while ( (bufferLength = inputStream.read(buffer)) > 0 ) { //add the data in the buffer to the file in the file output stream (the file on the sd card fileOutput.write(buffer, 0, bufferLength); //add up the size so we know how much is downloaded downloadedSize += bufferLength; } //close the output stream when done fileOutput.close(); SM.Debug(" ############## FINISH " + downloadedSize); return true; //catch some possible errors... } catch (MalformedURLException e) { e.printStackTrace(); SM.Exception(e.toString()); File SDCardRoot = Environment.getExternalStorageDirectory(); //delete file is failed to download File file = new File(SDCardRoot,"radioConfigFile.xml"); Boolean result = file.delete(); SM.Debug("DELETE FILE: " + result); return false; } catch (IOException e) { e.printStackTrace(); SM.Exception(e.toString()); File SDCardRoot = Environment.getExternalStorageDirectory(); //delete file is failed to download File file = new File(SDCardRoot,"radioConfigFile.xml"); Boolean result = file.delete(); SM.Debug("DELETE FILE: " + result); return false; } } /* private InputStream getTextFile(FileInputStream inputStream) { InputStream input = inputStream; int read; FileOutputStream fos = new FileOutputStream(new File(path + ".tmp")); //DataOutputStream os = new DataOutputStream(new FileOutputStream("\\data\\data\\com.safemobile.radiopadd\\files\\")); try { input = new DataInputStream(new FileInputStream("c:\\binary.smc")); while (true) { // exception deals catches EOF read = input.r fos.write(read); //os.writeInt(is.readByte()); } } catch (EOFException eof) { System.out.println("Normal program termination."); } catch (FileNotFoundException noFile) { System.err.println("File not found! " + noFile); } catch (IOException io) { System.err.println("I/O error occurred: " + io); } catch (Throwable anything) { System.err.println("Abnormal exception caught !: " + anything); } finally { if (is != null) { try { is.close(); os.close(); } catch (IOException ignored) { } } } } */ }