adapt opensearch reader and writer for xml suggestions
[rekonq:nikhilms-mainline.git] / src / opensearch / opensearchengine.cpp
1 /* ============================================================
2 *
3 * This file is a part of the rekonq project
4 *
5 * Copyright (C) 2009 by Jakub Wieczorek <faw217@gmail.com>
6 * Copyright (C) 2009 by Christian Franke <cfchris6@ts2server.com>
7 * Copyright (C) 2009 by Fredy Yanardi <fyanardi@gmail.com>
8 * Copyright (C) 2010 by Lionel Chauvin <megabigbug@yahoo.fr>
9 * Copyright (C) 2010 by Andrea Diamantini <adjam7 at gmail dot com>
10 *
11 *
12 * This program is free software; you can redistribute it and/or
13 * modify it under the terms of the GNU General Public License as
14 * published by the Free Software Foundation; either version 2 of
15 * the License or (at your option) version 3 or any later version
16 * accepted by the membership of KDE e.V. (or its successor approved
17 * by the membership of KDE e.V.), which shall act as a proxy
18 * defined in Section 14 of version 3 of the license.
19 *
20 * This program is distributed in the hope that it will be useful,
21 * but WITHOUT ANY WARRANTY; without even the implied warranty of
22 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
23 * GNU General Public License for more details.
24 *
25 * You should have received a copy of the GNU General Public License
26 * along with this program.  If not, see <http://www.gnu.org/licenses/>.
27 *
28 * ============================================================ */
29
30
31 // Self Includes
32 #include "opensearchengine.h"
33 #include "suggestionparser.h"
34
35 // Qt Includes
36 #include <QtCore/QRegExp>
37
38 OpenSearchEngine::OpenSearchEngine(QObject *)
39     : m_parser(0)
40 {
41 }
42
43
44 OpenSearchEngine::~OpenSearchEngine()
45 {
46     if (m_parser) 
47     {
48         delete m_parser;
49     }
50 }
51
52
53 QString OpenSearchEngine::parseTemplate(const QString &searchTerm, const QString &searchTemplate)
54 {
55     QString language = QLocale().name();
56     // Simple conversion to RFC 3066.
57     language = language.replace(QL1C('_'), QL1C('-'));
58
59     QString result = searchTemplate;
60     result.replace(QL1S("{count}"), QL1S("20"));
61     result.replace(QL1S("{startIndex}"), QL1S("0"));
62     result.replace(QL1S("{startPage}"), QL1S("0"));
63     result.replace(QL1S("{language}"), language);
64     result.replace(QL1S("{inputEncoding}"), QL1S("UTF-8"));
65     result.replace(QL1S("{outputEncoding}"), QL1S("UTF-8"));
66     result.replace(QL1S("{searchTerms}"), searchTerm);
67
68     return result;
69 }
70
71
72 QString OpenSearchEngine::name() const
73 {
74     return m_name;
75 }
76
77
78 void OpenSearchEngine::setName(const QString &name)
79 {
80     m_name = name;
81 }
82
83
84 QString OpenSearchEngine::description() const
85 {
86     return m_description;
87 }
88
89
90 void OpenSearchEngine::setDescription(const QString &description)
91 {
92     m_description = description;
93 }
94
95
96 QString OpenSearchEngine::searchUrlTemplate() const
97 {
98     return m_searchUrlTemplate;
99 }
100
101
102 void OpenSearchEngine::setSearchUrlTemplate(const QString &searchUrlTemplate)
103 {
104     m_searchUrlTemplate = searchUrlTemplate;
105 }
106
107
108 KUrl OpenSearchEngine::searchUrl(const QString &searchTerm) const
109 {
110     if (m_searchUrlTemplate.isEmpty()) 
111     {
112         return KUrl();
113     }
114
115     KUrl retVal = KUrl::fromEncoded(parseTemplate(searchTerm, m_searchUrlTemplate).toUtf8());
116
117     QList<Parameter>::const_iterator i;
118     for ( i = m_searchParameters.constBegin(); i != m_searchParameters.constEnd(); ++i) 
119     {
120         retVal.addQueryItem(i->first, parseTemplate(searchTerm, i->second));
121     }
122
123     return retVal;
124 }
125
126
127 bool OpenSearchEngine::providesSuggestions() const
128 {
129     return !m_suggestionsUrlTemplate.isEmpty();
130 }
131
132
133 QString OpenSearchEngine::suggestionsUrlTemplate() const
134 {
135     return m_suggestionsUrlTemplate;
136 }
137
138
139 void OpenSearchEngine::setSuggestionsUrlTemplate(const QString &suggestionsUrlTemplate)
140 {
141     m_suggestionsUrlTemplate = suggestionsUrlTemplate;
142 }
143
144
145 KUrl OpenSearchEngine::suggestionsUrl(const QString &searchTerm) const
146 {
147     if (m_suggestionsUrlTemplate.isEmpty()) 
148     {
149         return KUrl();
150     }
151
152     KUrl retVal = KUrl::fromEncoded(parseTemplate(searchTerm, m_suggestionsUrlTemplate).toUtf8());
153
154     QList<Parameter>::const_iterator i;
155     for( i = m_suggestionsParameters.constBegin(); i != m_suggestionsParameters.constEnd(); ++i)
156     {
157         retVal.addQueryItem(i->first, parseTemplate(searchTerm, i->second));
158     }
159     return retVal;
160 }
161
162
163 QList<OpenSearchEngine::Parameter> OpenSearchEngine::searchParameters() const
164 {
165     return m_searchParameters;
166 }
167
168
169 void OpenSearchEngine::setSearchParameters(const QList<Parameter> &searchParameters)
170 {
171     m_searchParameters = searchParameters;
172 }
173
174
175 QList<OpenSearchEngine::Parameter> OpenSearchEngine::suggestionsParameters() const
176 {
177     return m_suggestionsParameters;
178 }
179
180
181 void OpenSearchEngine::setSuggestionsParameters(const QList<Parameter> &suggestionsParameters)
182 {
183     m_suggestionsParameters = suggestionsParameters;
184 }
185
186
187 void OpenSearchEngine::setSuggestionParser(SuggestionParser *parser)
188 {
189     m_parser = parser;
190 }
191
192
193 QString OpenSearchEngine::imageUrl() const
194 {
195     return m_imageUrl;
196 }
197
198
199 void OpenSearchEngine::setImageUrl(const QString &imageUrl)
200 {
201     m_imageUrl = imageUrl;
202 }
203
204
205 QImage OpenSearchEngine::image() const
206 {
207     return m_image;
208 }
209
210
211 void OpenSearchEngine::setImage(const QImage &image)
212 {
213     m_image = image;
214 }
215
216
217 bool OpenSearchEngine::isValid() const
218 {
219     return (!m_name.isEmpty() && !m_searchUrlTemplate.isEmpty());
220 }
221
222
223 bool OpenSearchEngine::operator==(const OpenSearchEngine &other) const
224 {
225     return (m_name == other.m_name
226             && m_description == other.m_description
227             && m_imageUrl == other.m_imageUrl
228             && m_searchUrlTemplate == other.m_searchUrlTemplate
229             && m_suggestionsUrlTemplate == other.m_suggestionsUrlTemplate
230             && m_searchParameters == other.m_searchParameters
231             && m_suggestionsParameters == other.m_suggestionsParameters);
232 }
233
234
235 bool OpenSearchEngine::operator<(const OpenSearchEngine &other) const
236 {
237     return (m_name < other.m_name);
238 }
239
240
241 ResponseList OpenSearchEngine::parseSuggestion(const QByteArray &resp)
242 {
243     if (!m_parser)
244         return ResponseList();
245
246     return m_parser->parse(resp);
247 }
248
249
250 QString OpenSearchEngine::type()
251 {
252     return m_parser->type();
253 }