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