1 /*************************************************************************** 2 * Copyright (C) 2008 by Łukasz Jernaś * 3 * deejay1@srem.org * 4 * * 5 * This program is free software; you can redistribute it and/or modify * 6 * it under the terms of the GNU General Public License as published by * 7 * the Free Software Foundation; either version 2 of the License, or * 8 * (at your option) any later version. * 9 * * 10 * This program is distributed in the hope that it will be useful, * 11 * but WITHOUT ANY WARRANTY; without even the implied warranty of * 12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * 13 * GNU General Public License for more details. * 14 * * 15 * You should have received a copy of the GNU General Public License * 16 * along with this program; if not, write to the * 17 * Free Software Foundation, Inc., * 18 * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * 19 ***************************************************************************/ 20 #include "xmlstreamreader.h" 21 22 #include <QStringList> 23 #include <QLineF> 24 25 namespace NameFinder { 26 XmlStreamReader(QIODevice * device,QPointF coord)27 XmlStreamReader::XmlStreamReader(QIODevice *device, QPointF coord) { 28 myDevice = device; 29 theCenter = coord; 30 } 31 32 ~XmlStreamReader()33 XmlStreamReader::~XmlStreamReader() { 34 } 35 read()36 bool XmlStreamReader::read() { 37 myDevice->open(QIODevice::ReadOnly | QIODevice::Text); 38 reader.setDevice(myDevice); 39 reader.readNext(); 40 while (!reader.atEnd()) { 41 if (reader.isStartElement()) { 42 if (reader.name() == "searchresults") { 43 readSearchResultsElement(); 44 } else { 45 reader.raiseError(QObject::tr("Not a proper results stream!")); 46 } 47 } else { 48 reader.readNext(); 49 } 50 } 51 myDevice->close(); 52 53 qSort(myResults.begin(), myResults.end()); 54 55 // Implement error handling 56 return true; 57 } 58 readSearchResultsElement()59 void XmlStreamReader::readSearchResultsElement() { 60 reader.readNext(); 61 while (!reader.atEnd()) { 62 if (reader.isEndElement()) { 63 reader.readNext(); 64 break; 65 } 66 67 if (reader.isStartElement()) { 68 if (reader.name() == "place") { 69 readNamedElement(&myResults); 70 } else { 71 skipElement(); 72 } 73 } else { 74 reader.readNext(); 75 } 76 } 77 78 } readNamedElement(QList<NameFinderResult> * results)79 void XmlStreamReader::readNamedElement(QList<NameFinderResult> *results) { 80 NameFinderResult myResult; 81 myResult.name = reader.attributes().value("display_name").toString(); 82 myResult.type = reader.attributes().value("osm_type").toString(); 83 QStringList sBbox = reader.attributes().value("boundingbox").toString().split(","); 84 myResult.bbox = QRectF(QPointF(sBbox[2].toDouble(), sBbox[0].toDouble()), QPointF(sBbox[3].toDouble(), sBbox[1].toDouble())); 85 myResult.coord = QPointF(reader.attributes().value("lon").toString().toDouble(), reader.attributes().value("lat").toString().toDouble()); 86 myResult.category = reader.attributes().value("class").toString(); 87 myResult.info = reader.attributes().value("type").toString(); 88 89 myResult.distance = QLineF(theCenter, myResult.coord).length(); 90 91 reader.readNext(); 92 while (!reader.atEnd()) { 93 if (reader.isEndElement()) { 94 reader.readNext(); 95 break; 96 } 97 98 if (reader.isStartElement()) { 99 if (reader.name() == "place") { 100 readNamedElement(results); 101 // } else if (reader.name() == "description") { 102 // readDescriptionElement(&myResult); 103 // } else if (reader.name() == "nearestplaces") { 104 // readNearestPlacesElement(&myResult); 105 } else { 106 skipElement(); 107 } 108 } else { 109 reader.readNext(); 110 } 111 112 } 113 results->append(myResult); 114 } 115 skipElement()116 void XmlStreamReader::skipElement() { 117 reader.readNext(); 118 while (!reader.atEnd()) { 119 if (reader.isEndElement()) { 120 reader.readNext(); 121 break; 122 } 123 if (reader.isStartElement()) { 124 skipElement(); 125 } else { 126 reader.readNext(); 127 } 128 } 129 } 130 131 // void XmlStreamReader::readDescriptionElement(NameFinderResult *result) { 132 // result->description = reader.readElementText(); 133 // while (!reader.atEnd()) { 134 // if (reader.isEndElement()) { 135 // reader.readNext(); 136 // break; 137 // } else { 138 // skipElement(); 139 // } 140 // } 141 // } 142 // 143 // void XmlStreamReader::readNearestPlacesElement(NameFinderResult *result) { 144 // reader.readNext(); 145 // while (!reader.atEnd()) { 146 // if (reader.isEndElement()) { 147 // reader.readNext(); 148 // break; 149 // } 150 // if (reader.isStartElement()) { 151 // if (reader.name() == "named") { 152 // QList<NameFinderResult> nearResults; 153 // readNamedElement(&nearResults); 154 // result->near = nearResults; 155 // } else { 156 // skipElement(); 157 // } 158 // } else { 159 // reader.readNext(); 160 // } 161 // } 162 // } 163 getResults()164 QList<NameFinderResult> XmlStreamReader::getResults() { 165 return myResults; 166 } 167 } 168