1 /**************************************************************************
2 * Otter Browser: Web browser controlled by the user, not vice-versa.
3 * Copyright (C) 2014, 2016 Piotr Wójcik <chocimier@tlen.pl>
4 * Copyright (C) 2014 - 2018 Michal Dutkiewicz aka Emdek <michal@emdek.pl>
5 *
6 * This program is free software: you can redistribute it and/or modify
7 * it under the terms of the GNU General Public License as published by
8 * the Free Software Foundation, either version 3 of the License, or
9 * (at your option) any later version.
10 *
11 * This program is distributed in the hope that it will be useful,
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 * GNU General Public License for more details.
15 *
16 * You should have received a copy of the GNU General Public License
17 * along with this program. If not, see <http://www.gnu.org/licenses/>.
18 *
19 **************************************************************************/
20
21 #include "OperaSearchEnginesImporter.h"
22 #include "../../../core/IniSettings.h"
23 #include "../../../core/SearchEnginesManager.h"
24 #include "../../../core/SessionsManager.h"
25 #include "../../../core/SettingsManager.h"
26 #include "../../../core/Utils.h"
27
28 #include <QtCore/QDir>
29 #include <QtCore/QFileInfo>
30 #include <QtCore/QStandardPaths>
31 #include <QtCore/QUrl>
32
33 namespace Otter
34 {
35
OperaSearchEnginesImporter(QObject * parent)36 OperaSearchEnginesImporter::OperaSearchEnginesImporter(QObject *parent) : Importer(parent),
37 m_optionsWidget(nullptr)
38 {
39 }
40
createOptionsWidget(QWidget * parent)41 QWidget* OperaSearchEnginesImporter::createOptionsWidget(QWidget *parent)
42 {
43 if (!m_optionsWidget)
44 {
45 m_optionsWidget = new QCheckBox(tr("Remove existing search engines"), parent);
46 }
47
48 return m_optionsWidget;
49 }
50
getTitle() const51 QString OperaSearchEnginesImporter::getTitle() const
52 {
53 return tr("Opera search engines");
54 }
55
getDescription() const56 QString OperaSearchEnginesImporter::getDescription() const
57 {
58 return tr("Imports search engines from Opera Browser version 12 or earlier");
59 }
60
getVersion() const61 QString OperaSearchEnginesImporter::getVersion() const
62 {
63 return QLatin1String("0.8");
64 }
65
getSuggestedPath(const QString & path) const66 QString OperaSearchEnginesImporter::getSuggestedPath(const QString &path) const
67 {
68 if (!path.isEmpty())
69 {
70 if (QFileInfo(path).isDir())
71 {
72 return QDir(path).filePath(QLatin1String("search.ini"));
73 }
74
75 return path;
76 }
77
78 #if !defined(Q_OS_MAC) && defined(Q_OS_UNIX)
79 const QString homePath(QStandardPaths::standardLocations(QStandardPaths::HomeLocation).value(0));
80
81 if (!homePath.isEmpty())
82 {
83 return QDir(homePath).filePath(QLatin1String(".opera/search.ini"));
84 }
85 #endif
86
87 return path;
88 }
89
getBrowser() const90 QString OperaSearchEnginesImporter::getBrowser() const
91 {
92 return QLatin1String("opera");
93 }
94
getHomePage() const95 QUrl OperaSearchEnginesImporter::getHomePage() const
96 {
97 return QUrl(QLatin1String("https://otter-browser.org/"));
98 }
99
getFileFilters() const100 QStringList OperaSearchEnginesImporter::getFileFilters() const
101 {
102 return {tr("Opera search engines files (search.ini)")};
103 }
104
getImportType() const105 Importer::ImportType OperaSearchEnginesImporter::getImportType() const
106 {
107 return SearchEnginesImport;
108 }
109
import(const QString & path)110 bool OperaSearchEnginesImporter::import(const QString &path)
111 {
112 IniSettings settings(getSuggestedPath(path), this);
113
114 if (settings.hasError())
115 {
116 emit importFinished(SearchEnginesImport, FailedImport, 0);
117
118 return false;
119 }
120
121 emit importStarted(SearchEnginesImport, -1);
122
123 if (m_optionsWidget->isChecked())
124 {
125 SettingsManager::setOption(SettingsManager::Search_SearchEnginesOrderOption, QStringList());
126 }
127
128 const QStringList groups(settings.getGroups());
129 QStringList keywords(SearchEnginesManager::getSearchKeywords());
130
131 settings.beginGroup(QLatin1String("Options"));
132
133 const QVariant defaultSearchEngine(settings.getValue(QLatin1String("Default Search")));
134 int totalAmount(0);
135
136 for (int i = 0; i < groups.count(); ++i)
137 {
138 if (!groups.at(i).startsWith(QLatin1String("Search Engine ")))
139 {
140 continue;
141 }
142
143 settings.beginGroup(groups.at(i));
144
145 if (settings.getValue(QLatin1String("Deleted")).toInt())
146 {
147 continue;
148 }
149
150 SearchEnginesManager::SearchEngineDefinition searchEngine;
151 searchEngine.title = settings.getValue(QLatin1String("Name")).toString();
152 searchEngine.keyword = Utils::createIdentifier(settings.getValue(QLatin1String("Key")).toString(), keywords);
153 searchEngine.encoding = settings.getValue(QLatin1String("Encoding")).toString();
154 searchEngine.resultsUrl.url = settings.getValue(QLatin1String("URL")).toString().replace(QLatin1String("%s"), QLatin1String("{searchTerms}"));
155 searchEngine.identifier = searchEngine.createIdentifier();
156
157 if (settings.getValue(QLatin1String("Is post")).toInt())
158 {
159 searchEngine.resultsUrl.method = QLatin1String("post");
160 searchEngine.resultsUrl.enctype = QLatin1String("application/x-www-form-urlencoded");
161 searchEngine.resultsUrl.parameters = QUrlQuery(settings.getValue(QLatin1String("Query")).toString().replace(QLatin1String("%s"), QLatin1String("{searchTerms}")));
162 }
163 else
164 {
165 searchEngine.resultsUrl.method = QLatin1String("get");
166 }
167
168 if (settings.getValue(QLatin1String("Suggest Protocol")).toString() == QLatin1String("JSON"))
169 {
170 searchEngine.suggestionsUrl.url = settings.getValue(QLatin1String("Suggest URL")).toString();
171 searchEngine.suggestionsUrl.method = QLatin1String("get");
172 }
173
174 if (SearchEnginesManager::addSearchEngine(searchEngine))
175 {
176 if (m_optionsWidget->isChecked() && settings.getValue(QLatin1String("UNIQUEID")) == defaultSearchEngine)
177 {
178 SettingsManager::setOption(SettingsManager::Search_DefaultSearchEngineOption, searchEngine.identifier);
179 SettingsManager::setOption(SettingsManager::Search_DefaultQuickSearchEngineOption, searchEngine.identifier);
180 }
181
182 keywords.append(searchEngine.keyword);
183
184 ++totalAmount;
185 }
186 }
187
188 emit importFinished(SearchEnginesImport, SuccessfullImport, totalAmount);
189
190 return true;
191 }
192
193 }
194