1 /*
2 SPDX-FileCopyrightText: 2015-2021 Laurent Montel <montel@kde.org>
3
4 SPDX-License-Identifier: GPL-2.0-or-later
5 */
6
7 #include "shareserviceurlmanager.h"
8
9 #include "pimcommon_debug.h"
10 #include <KActionMenu>
11 #include <KLocalizedString>
12 #include <QDesktopServices>
13 #include <QMenu>
14 #include <QUrlQuery>
15
16 using namespace PimCommon;
17
18 class PimCommon::ShareServiceUrlManagerPrivate
19 {
20 public:
ShareServiceUrlManagerPrivate(ShareServiceUrlManager * qq)21 explicit ShareServiceUrlManagerPrivate(ShareServiceUrlManager *qq)
22 : q(qq)
23 {
24 }
25
26 Q_REQUIRED_RESULT QIcon typeToIcon(ShareServiceUrlManager::ServiceType type) const;
27 Q_REQUIRED_RESULT QString typeToI18n(ShareServiceUrlManager::ServiceType type) const;
28 void initializeMenu();
29 KActionMenu *mMenu = nullptr;
30 ShareServiceUrlManager *const q;
31 };
32
initializeMenu()33 void ShareServiceUrlManagerPrivate::initializeMenu()
34 {
35 mMenu = new KActionMenu(QIcon::fromTheme(QStringLiteral("document-share")), i18n("Share On..."), q);
36 for (int i = 0; i < ShareServiceUrlManager::ServiceEndType; ++i) {
37 const auto type = static_cast<ShareServiceUrlManager::ServiceType>(i);
38 auto action = new QAction(i18nc("@action:inmenu Share On...", "%1", typeToI18n(type)), q);
39 action->setData(QVariant::fromValue(type));
40 const QIcon icon = typeToIcon(type);
41 if (!icon.isNull()) {
42 action->setIcon(icon);
43 }
44 mMenu->addAction(action);
45 }
46 q->connect(mMenu->menu(), &QMenu::triggered, q, &ShareServiceUrlManager::slotSelectServiceUrl);
47 }
48
typeToIcon(ShareServiceUrlManager::ServiceType type) const49 QIcon ShareServiceUrlManagerPrivate::typeToIcon(ShareServiceUrlManager::ServiceType type) const
50 {
51 QIcon icon;
52 switch (type) {
53 case ShareServiceUrlManager::Fbook:
54 icon = QIcon::fromTheme(QStringLiteral("im-facebook"));
55 break;
56 case ShareServiceUrlManager::Twitter:
57 icon = QIcon::fromTheme(QStringLiteral("im-twitter"));
58 break;
59 case ShareServiceUrlManager::MailTo:
60 icon = QIcon::fromTheme(QStringLiteral("kmail"));
61 break;
62 case ShareServiceUrlManager::LinkedIn:
63 break;
64 case ShareServiceUrlManager::Evernote:
65 break;
66 case ShareServiceUrlManager::Pocket:
67 break;
68 case ShareServiceUrlManager::LiveJournal:
69 break;
70 case ShareServiceUrlManager::ServiceEndType:
71 qCWarning(PIMCOMMON_LOG) << "icon for unknown type requested. It's a bug.";
72 break;
73 }
74
75 return icon;
76 }
77
typeToI18n(ShareServiceUrlManager::ServiceType type) const78 QString ShareServiceUrlManagerPrivate::typeToI18n(ShareServiceUrlManager::ServiceType type) const
79 {
80 QString str;
81 switch (type) {
82 case ShareServiceUrlManager::Fbook:
83 str = i18n("Facebook");
84 break;
85 case ShareServiceUrlManager::Twitter:
86 str = i18n("Twitter");
87 break;
88 case ShareServiceUrlManager::MailTo:
89 str = i18n("Mail");
90 break;
91 case ShareServiceUrlManager::LinkedIn:
92 str = i18n("LinkedIn");
93 break;
94 case ShareServiceUrlManager::Evernote:
95 str = i18n("Evernote");
96 break;
97 case ShareServiceUrlManager::Pocket:
98 str = i18n("Pocket");
99 break;
100 case ShareServiceUrlManager::LiveJournal:
101 str = i18n("LiveJournal");
102 break;
103 case ShareServiceUrlManager::ServiceEndType:
104 qCWarning(PIMCOMMON_LOG) << "text for unknown type requested. It's a bug.";
105 break;
106 }
107 return str;
108 }
109
ShareServiceUrlManager(QObject * parent)110 ShareServiceUrlManager::ShareServiceUrlManager(QObject *parent)
111 : QObject(parent)
112 , d(new PimCommon::ShareServiceUrlManagerPrivate(this))
113 {
114 d->initializeMenu();
115 }
116
117 ShareServiceUrlManager::~ShareServiceUrlManager() = default;
118
menu() const119 KActionMenu *ShareServiceUrlManager::menu() const
120 {
121 return d->mMenu;
122 }
123
slotSelectServiceUrl(QAction * act)124 void ShareServiceUrlManager::slotSelectServiceUrl(QAction *act)
125 {
126 if (act) {
127 const auto type = act->data().value<PimCommon::ShareServiceUrlManager::ServiceType>();
128 Q_EMIT serviceUrlSelected(type);
129 }
130 }
131
generateServiceUrl(const QString & link,const QString & title,ServiceType type)132 QUrl ShareServiceUrlManager::generateServiceUrl(const QString &link, const QString &title, ServiceType type)
133 {
134 QUrl url;
135 if (link.isEmpty()) {
136 return url;
137 }
138 switch (type) {
139 case Fbook: {
140 url.setUrl(QStringLiteral("https://www.facebook.com/sharer.php"));
141 QUrlQuery urlQuery;
142 urlQuery.addQueryItem(QStringLiteral("u"), link);
143 urlQuery.addQueryItem(QStringLiteral("t"), title);
144 url.setQuery(urlQuery);
145 break;
146 }
147 case Twitter: {
148 url.setUrl(QStringLiteral("https://twitter.com/share"));
149 QUrlQuery urlQuery;
150 urlQuery.addQueryItem(QStringLiteral("url"), link);
151 urlQuery.addQueryItem(QStringLiteral("text"), title);
152 url.setQuery(urlQuery);
153 break;
154 }
155 case MailTo: {
156 url.setUrl(QStringLiteral("mailto:"));
157 QUrlQuery urlQuery;
158 urlQuery.addQueryItem(QStringLiteral("subject"), title);
159 urlQuery.addQueryItem(QStringLiteral("body"), link);
160 url.setQuery(urlQuery);
161 break;
162 }
163 case LinkedIn: {
164 url.setUrl(QStringLiteral("http://www.linkedin.com/shareArticle"));
165 QUrlQuery urlQuery;
166 urlQuery.addQueryItem(QStringLiteral("mini"), QStringLiteral("true"));
167 urlQuery.addQueryItem(QStringLiteral("url"), link);
168 urlQuery.addQueryItem(QStringLiteral("title"), title);
169 url.setQuery(urlQuery);
170 break;
171 }
172 case Evernote: {
173 url.setUrl(QStringLiteral("https://www.evernote.com/clip.action"));
174 QUrlQuery urlQuery;
175 urlQuery.addQueryItem(QStringLiteral("url"), link);
176 urlQuery.addQueryItem(QStringLiteral("title"), title);
177 url.setQuery(urlQuery);
178 break;
179 }
180 case Pocket: {
181 url.setUrl(QStringLiteral("https://getpocket.com/save"));
182 QUrlQuery urlQuery;
183 urlQuery.addQueryItem(QStringLiteral("url"), link);
184 urlQuery.addQueryItem(QStringLiteral("title"), title);
185 url.setQuery(urlQuery);
186 break;
187 }
188 case LiveJournal: {
189 url.setUrl(QStringLiteral("http://www.livejournal.com/update.bml"));
190 QUrlQuery urlQuery;
191 urlQuery.addQueryItem(QStringLiteral("event"), link);
192 urlQuery.addQueryItem(QStringLiteral("subject"), title);
193 url.setQuery(urlQuery);
194 break;
195 }
196 case ServiceEndType:
197 break;
198 }
199 return url;
200 }
201
openUrl(const QUrl & url)202 void ShareServiceUrlManager::openUrl(const QUrl &url)
203 {
204 if (url.isValid()) {
205 QDesktopServices::openUrl(url);
206 } else {
207 qCDebug(PIMCOMMON_LOG) << "url is invalid.";
208 }
209 }
210