1 /*
2  * %kadu copyright begin%
3  * Copyright 2009, 2010, 2011 Piotr Galiszewski (piotr.galiszewski@kadu.im)
4  * Copyright 2010, 2012 Wojciech Treter (juzefwt@gmail.com)
5  * Copyright 2010, 2011, 2012 Piotr Dąbrowski (ultr@ultr.pl)
6  * Copyright 2010, 2011, 2012, 2013 Bartosz Brachaczek (b.brachaczek@gmail.com)
7  * Copyright 2009, 2010, 2011, 2012, 2013, 2014 Rafał Przemysław Malinowski (rafal.przemyslaw.malinowski@gmail.com)
8  * %kadu copyright end%
9  *
10  * This program is free software; you can redistribute it and/or
11  * modify it under the terms of the GNU General Public License as
12  * published by the Free Software Foundation; either version 2 of
13  * the License, or (at your option) any later version.
14  *
15  * This program is distributed in the hope that it will be useful,
16  * but WITHOUT ANY WARRANTY; without even the implied warranty of
17  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
18  * GNU General Public License for more details.
19  *
20  * You should have received a copy of the GNU General Public License
21  * along with this program. If not, see <http://www.gnu.org/licenses/>.
22  */
23 
24 #include "accounts/account-manager.h"
25 #include "accounts/account.h"
26 #include "icons/icons-manager.h"
27 #include "icons/kadu-icon.h"
28 #include "identities/identity-manager.h"
29 #include "protocols/protocol.h"
30 #include "status/all-accounts-status-container.h"
31 #include "status/status-configuration-holder.h"
32 #include "status/status-container-aware-object.h"
33 #include "status/status-type-manager.h"
34 #include "status/status-type.h"
35 
36 #include "status-container-manager.h"
37 
StatusContainerManager(QObject * parent)38 StatusContainerManager::StatusContainerManager(QObject *parent) :
39 		StatusContainer(parent), DefaultStatusContainer(0)
40 {
41 }
42 
~StatusContainerManager()43 StatusContainerManager::~StatusContainerManager()
44 {
45 }
46 
setAccountManager(AccountManager * accountManager)47 void StatusContainerManager::setAccountManager(AccountManager *accountManager)
48 {
49 	m_accountManager = accountManager;
50 }
51 
setIdentityManager(IdentityManager * identityManager)52 void StatusContainerManager::setIdentityManager(IdentityManager *identityManager)
53 {
54 	m_identityManager = identityManager;
55 }
56 
setStatusConfigurationHolder(StatusConfigurationHolder * statusConfigurationHolder)57 void StatusContainerManager::setStatusConfigurationHolder(StatusConfigurationHolder *statusConfigurationHolder)
58 {
59 	m_statusConfigurationHolder = statusConfigurationHolder;
60 }
61 
setStatusTypeManager(StatusTypeManager * statusTypeManager)62 void StatusContainerManager::setStatusTypeManager(StatusTypeManager *statusTypeManager)
63 {
64 	m_statusTypeManager = statusTypeManager;
65 }
66 
init()67 void StatusContainerManager::init()
68 {
69 	if (m_statusConfigurationHolder->isSetStatusPerIdentity())
70 		triggerAllIdentitiesAdded(m_identityManager);
71 	else if (m_statusConfigurationHolder->isSetStatusPerAccount())
72 		triggerAllAccountsRegistered(m_accountManager);
73 	else
74 		registerStatusContainer(m_allAccountsStatusContainer);
75 
76 	connect(m_statusConfigurationHolder, SIGNAL(setStatusModeChanged()), this, SLOT(setStatusModeChanged()));
77 	connect(m_accountManager, SIGNAL(accountUpdated(Account)), this, SLOT(updateIdentities()));
78 }
79 
done()80 void StatusContainerManager::done()
81 {
82 	if (m_statusConfigurationHolder)
83 	{
84 		if (m_statusConfigurationHolder->isSetStatusPerIdentity())
85 			triggerAllIdentitiesRemoved(m_identityManager);
86 		else if (m_statusConfigurationHolder->isSetStatusPerAccount())
87 			triggerAllAccountsUnregistered(m_accountManager);
88 		else
89 			unregisterStatusContainer(m_allAccountsStatusContainer);
90 	}
91 }
92 
updateIdentities()93 void StatusContainerManager::updateIdentities()
94 {
95 	if (!m_statusConfigurationHolder->isSetStatusPerIdentity())
96 		return;
97 
98 	foreach (const Identity &identity, m_identityManager->items())
99 		if (StatusContainers.contains(identity.statusContainer()) && !identity.hasAnyAccountWithDetails())
100 			unregisterStatusContainer(identity.statusContainer());
101 		else if (!StatusContainers.contains(identity.statusContainer()) && identity.hasAnyAccountWithDetails())
102 			registerStatusContainer(identity.statusContainer());
103 }
104 
accountRegistered(Account account)105 void StatusContainerManager::accountRegistered(Account account)
106 {
107 	if (m_statusConfigurationHolder->isSetStatusPerAccount() && !StatusContainers.contains(account.statusContainer()))
108 		registerStatusContainer(account.statusContainer());
109 
110 	if (m_statusConfigurationHolder->isSetStatusPerIdentity() && !StatusContainers.contains(account.accountIdentity().statusContainer()))
111 		updateIdentities();
112 }
113 
accountUnregistered(Account account)114 void StatusContainerManager::accountUnregistered(Account account)
115 {
116 	if (m_statusConfigurationHolder->isSetStatusPerAccount() && StatusContainers.contains(account.statusContainer()))
117 		unregisterStatusContainer(account.statusContainer());
118 
119 	if (m_statusConfigurationHolder->isSetStatusPerIdentity())
120 		updateIdentities();
121 }
122 
identityAdded(Identity identity)123 void StatusContainerManager::identityAdded(Identity identity)
124 {
125 	if (m_statusConfigurationHolder->isSetStatusPerIdentity() && !StatusContainers.contains(identity.statusContainer()) && identity.hasAnyAccountWithDetails())
126 		registerStatusContainer(identity.statusContainer());
127 }
128 
identityRemoved(Identity identity)129 void StatusContainerManager::identityRemoved(Identity identity)
130 {
131 	if (m_statusConfigurationHolder->isSetStatusPerIdentity() && StatusContainers.contains(identity.statusContainer()))
132 		unregisterStatusContainer(identity.statusContainer());
133 }
134 
cleanStatusContainers()135 void StatusContainerManager::cleanStatusContainers()
136 {
137 	while (!StatusContainers.isEmpty())
138 		unregisterStatusContainer(StatusContainers.at(0));
139 }
140 
addAllAccounts()141 void StatusContainerManager::addAllAccounts()
142 {
143 	foreach (Account account, m_accountManager->items())
144 		registerStatusContainer(account.statusContainer());
145 }
146 
addAllIdentities()147 void StatusContainerManager::addAllIdentities()
148 {
149 	updateIdentities();
150 }
151 
setAllAccountsStatusContainer(AllAccountsStatusContainer * allAccountsStatusContainer)152 void StatusContainerManager::setAllAccountsStatusContainer(AllAccountsStatusContainer *allAccountsStatusContainer)
153 {
154 	m_allAccountsStatusContainer = allAccountsStatusContainer;
155 }
156 
setDefaultStatusContainer(StatusContainer * defaultStatusContainer)157 void StatusContainerManager::setDefaultStatusContainer(StatusContainer *defaultStatusContainer)
158 {
159 	if (defaultStatusContainer == DefaultStatusContainer)
160 		return;
161 
162 	if (DefaultStatusContainer)
163 		disconnect(DefaultStatusContainer, 0, this, 0);
164 
165 	if (this != defaultStatusContainer)
166 		DefaultStatusContainer = defaultStatusContainer;
167 	else
168 		DefaultStatusContainer = 0;
169 
170 	if (DefaultStatusContainer)
171 		connect(DefaultStatusContainer, SIGNAL(statusUpdated(StatusContainer *)), this, SIGNAL(statusUpdated(StatusContainer *)));
172 
173 	emit statusUpdated(this);
174 }
175 
setStatusModeChanged()176 void StatusContainerManager::setStatusModeChanged()
177 {
178 	cleanStatusContainers();
179 	if (m_statusConfigurationHolder->isSetStatusPerIdentity())
180 		addAllIdentities();
181 	else if (m_statusConfigurationHolder->isSetStatusPerAccount())
182 		addAllAccounts();
183 	else
184 		registerStatusContainer(m_allAccountsStatusContainer);
185 }
186 
registerStatusContainer(StatusContainer * statusContainer)187 void StatusContainerManager::registerStatusContainer(StatusContainer *statusContainer)
188 {
189 	if (StatusContainers.isEmpty())
190 		setDefaultStatusContainer(statusContainer);
191 
192 	emit statusContainerAboutToBeRegistered(statusContainer);
193 	StatusContainers.append(statusContainer);
194 	emit statusContainerRegistered(statusContainer);
195 	StatusContainerAwareObject::notifyStatusContainerRegistered(statusContainer);
196 
197 	connect(statusContainer, SIGNAL(statusUpdated(StatusContainer *)), this, SIGNAL(statusUpdated(StatusContainer *)));
198 }
199 
unregisterStatusContainer(StatusContainer * statusContainer)200 void StatusContainerManager::unregisterStatusContainer(StatusContainer *statusContainer)
201 {
202 	emit statusContainerAboutToBeUnregistered(statusContainer);
203 	StatusContainers.removeAll(statusContainer);
204 	emit statusContainerUnregistered(statusContainer);
205 	StatusContainerAwareObject::notifyStatusContainerUnregistered(statusContainer);
206 
207 	if (statusContainer == DefaultStatusContainer)
208 	{
209 		if (StatusContainers.isEmpty())
210 			setDefaultStatusContainer(0);
211 		else
212 			setDefaultStatusContainer(StatusContainers.at(0));
213 	}
214 
215 	disconnect(statusContainer, 0, this, 0);
216 }
217 
allStatusOfType(StatusType type)218 bool StatusContainerManager::allStatusOfType(StatusType type)
219 {
220 	if (StatusType::None == type)
221 		return false;
222 
223 	foreach (StatusContainer *container, StatusContainers)
224 		if (container->status().type() != type)
225 			return false;
226 	return true;
227 }
228 
statusContainerName()229 QString StatusContainerManager::statusContainerName()
230 {
231 	return tr("All");
232 }
233 
setStatus(Status status,StatusChangeSource source)234 void StatusContainerManager::setStatus(Status status, StatusChangeSource source)
235 {
236 	foreach (StatusContainer *container, StatusContainers)
237 		container->setStatus(status, source);
238 }
239 
status()240 Status StatusContainerManager::status()
241 {
242 	return DefaultStatusContainer
243 			? DefaultStatusContainer->status()
244 			: Status();
245 }
246 
isStatusSettingInProgress()247 bool StatusContainerManager::isStatusSettingInProgress()
248 {
249 	return DefaultStatusContainer
250 			? DefaultStatusContainer->isStatusSettingInProgress()
251 			: false;
252 }
253 
statusIcon()254 KaduIcon StatusContainerManager::statusIcon()
255 {
256 	return statusIcon(status());
257 }
258 
statusIcon(const Status & status)259 KaduIcon StatusContainerManager::statusIcon(const Status &status)
260 {
261 	if (!DefaultStatusContainer)
262 		return m_statusTypeManager->statusIcon("common", Status{StatusType::Offline});
263 
264 	return m_statusTypeManager->statusIcon("common", status);
265 }
266 
supportedStatusTypes()267 QList<StatusType> StatusContainerManager::supportedStatusTypes()
268 {
269 	return DefaultStatusContainer
270 			? DefaultStatusContainer->supportedStatusTypes()
271 			: QList<StatusType>();
272 }
273 
maxDescriptionLength()274 int StatusContainerManager::maxDescriptionLength()
275 {
276 	return DefaultStatusContainer
277 			? DefaultStatusContainer->maxDescriptionLength()
278 			: -1;
279 }
280 
statusNamePrefix()281 QString StatusContainerManager::statusNamePrefix()
282 {
283 	return tr("All") + ' ';
284 }
285 
loadStatus()286 Status StatusContainerManager::loadStatus()
287 {
288 	return DefaultStatusContainer
289 			? DefaultStatusContainer->loadStatus()
290 			: Status();
291 }
292 
storeStatus(Status status)293 void StatusContainerManager::storeStatus(Status status)
294 {
295 	foreach (StatusContainer *statusContainer, StatusContainers)
296 		statusContainer->storeStatus(status);
297 }
298 
subStatusContainers()299 QList<StatusContainer *> StatusContainerManager::subStatusContainers()
300 {
301 	return StatusContainers;
302 }
303 
statusContainerForAccount(Account account) const304 StatusContainer * StatusContainerManager::statusContainerForAccount(Account account) const
305 {
306 	if (m_statusConfigurationHolder->isSetStatusPerAccount())
307 		return account.statusContainer();
308 	if (m_statusConfigurationHolder->isSetStatusPerIdentity())
309 		return account.accountIdentity().statusContainer();
310 	return m_allAccountsStatusContainer;
311 }
312 
313 #include "moc_status-container-manager.cpp"
314