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