1 /*
2 * %kadu copyright begin%
3 * Copyright 2011 Piotr Galiszewski (piotr.galiszewski@kadu.im)
4 * Copyright 2011, 2012, 2013, 2014 Bartosz Brachaczek (b.brachaczek@gmail.com)
5 * Copyright 2011, 2012, 2013, 2014 Rafał Przemysław Malinowski (rafal.przemyslaw.malinowski@gmail.com)
6 * %kadu copyright end%
7 *
8 * This program is free software; you can redistribute it and/or
9 * modify it under the terms of the GNU General Public License as
10 * published by the Free Software Foundation; either version 2 of
11 * the License, or (at your option) any later version.
12 *
13 * This program is distributed in the hope that it will be useful,
14 * but WITHOUT ANY WARRANTY; without even the implied warranty of
15 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16 * GNU General Public License for more details.
17 *
18 * You should have received a copy of the GNU General Public License
19 * along with this program. If not, see <http://www.gnu.org/licenses/>.
20 */
21
22 #include <QtGui/QCursor>
23 #include <QtWidgets/QMenu>
24
25 #include "accounts/account-manager.h"
26 #include "accounts/account.h"
27 #include "chat/chat-manager.h"
28 #include "chat/chat-storage.h"
29 #include "chat/type/chat-type-contact.h"
30 #include "contacts/contact-manager.h"
31 #include "contacts/contact-set.h"
32 #include "contacts/contact.h"
33 #include "gui/widgets/chat-widget/chat-widget-manager.h"
34 #include "icons/icons-manager.h"
35 #include "icons/kadu-icon.h"
36 #include "misc/misc.h"
37 #include "status/status-container.h"
38
39 #include "gadu-url-handler.h"
40
GaduUrlHandler(QObject * parent)41 GaduUrlHandler::GaduUrlHandler(QObject *parent) :
42 QObject{parent}
43 {
44 m_gaduRegExp = QRegExp("\\bgg:(/){0,3}[0-9]{1,12}\\b");
45 }
46
~GaduUrlHandler()47 GaduUrlHandler::~GaduUrlHandler()
48 {
49 }
50
setAccountManager(AccountManager * accountManager)51 void GaduUrlHandler::setAccountManager(AccountManager *accountManager)
52 {
53 m_accountManager = accountManager;
54 }
55
setChatManager(ChatManager * chatManager)56 void GaduUrlHandler::setChatManager(ChatManager *chatManager)
57 {
58 m_chatManager = chatManager;
59 }
60
setChatStorage(ChatStorage * chatStorage)61 void GaduUrlHandler::setChatStorage(ChatStorage *chatStorage)
62 {
63 m_chatStorage = chatStorage;
64 }
65
setChatWidgetManager(ChatWidgetManager * chatWidgetManager)66 void GaduUrlHandler::setChatWidgetManager(ChatWidgetManager *chatWidgetManager)
67 {
68 m_chatWidgetManager = chatWidgetManager;
69 }
70
setContactManager(ContactManager * contactManager)71 void GaduUrlHandler::setContactManager(ContactManager *contactManager)
72 {
73 m_contactManager = contactManager;
74 }
75
setIconsManager(IconsManager * iconsManager)76 void GaduUrlHandler::setIconsManager(IconsManager *iconsManager)
77 {
78 m_iconsManager = iconsManager;
79 }
80
isUrlValid(const QByteArray & url)81 bool GaduUrlHandler::isUrlValid(const QByteArray &url)
82 {
83 return m_gaduRegExp.exactMatch(QString::fromUtf8(url));
84 }
85
openUrl(UrlOpener * urlOpener,const QByteArray & url,bool disableMenu)86 void GaduUrlHandler::openUrl(UrlOpener *urlOpener, const QByteArray &url, bool disableMenu)
87 {
88 Q_UNUSED(urlOpener);
89
90 auto gaduAccounts = m_accountManager->byProtocolName("gadu");
91 if (gaduAccounts.isEmpty())
92 return;
93
94 auto gaduId = QString::fromUtf8(url);
95 if (gaduId.startsWith(QStringLiteral("gg:")))
96 {
97 gaduId.remove(0, 3);
98 gaduId.remove(QRegExp("/*"));
99 }
100
101 if (gaduAccounts.count() == 1 || disableMenu)
102 {
103 auto const &contact = m_contactManager->byId(gaduAccounts[0], gaduId, ActionCreateAndAdd);
104 auto const &chat = ChatTypeContact::findChat(m_chatManager, m_chatStorage, contact, ActionCreateAndAdd);
105 if (chat)
106 {
107 m_chatWidgetManager->openChat(chat, OpenChatActivation::Activate);
108 return;
109 }
110 }
111 else
112 {
113 QMenu menu;
114
115 QStringList ids;
116 for (auto const &account : gaduAccounts)
117 {
118 ids.clear();
119 ids.append(account.id());
120 ids.append(gaduId);
121
122 menu.addAction(m_iconsManager->iconByPath(account.statusContainer()->statusIcon()), account.id())->setData(ids);
123 }
124
125 connect(&menu, SIGNAL(triggered(QAction *)), this, SLOT(accountSelected(QAction *)));
126
127 menu.exec(QCursor::pos());
128 }
129 }
130
accountSelected(QAction * action)131 void GaduUrlHandler::accountSelected(QAction *action)
132 {
133 auto ids = action->data().toStringList();
134
135 if (ids.count() != 2)
136 return;
137
138 auto account = m_accountManager->byId(QStringLiteral("gadu"), ids[0]);
139 if (!account)
140 return;
141
142 const Contact &contact = m_contactManager->byId(account, ids[1], ActionCreateAndAdd);
143 const Chat &chat = ChatTypeContact::findChat(m_chatManager, m_chatStorage, contact, ActionCreateAndAdd);
144 m_chatWidgetManager->openChat(chat, OpenChatActivation::Activate);
145 }
146
147 #include "moc_gadu-url-handler.cpp"
148