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