|
1 /* |
|
2 * Copyright (c) 2009 - 2010 Nokia Corporation and/or its subsidiary(-ies). |
|
3 * All rights reserved. |
|
4 * This component and the accompanying materials are made available |
|
5 * under the terms of "Eclipse Public License v1.0" |
|
6 * which accompanies this distribution, and is available |
|
7 * at the URL "http://www.eclipse.org/legal/epl-v10.html". |
|
8 * |
|
9 * Initial Contributors: |
|
10 * Nokia Corporation - initial contribution. |
|
11 * |
|
12 * Contributors: |
|
13 * |
|
14 * Description: This file implements class CMailMailboxDetails. |
|
15 * |
|
16 */ |
|
17 |
|
18 #include <cmailhandlerplugin.mbg> // icons |
|
19 #include <StringLoader.h> |
|
20 #include <emailwidget.rsg> |
|
21 |
|
22 #include <memaildata.h> |
|
23 #include <emailobserverplugin.h> |
|
24 #include <memailmailboxdata.h> |
|
25 #include <memailapplaunchdata.h> |
|
26 |
|
27 #include "emailtrace.h" |
|
28 #include "cmailpluginproxy.h" |
|
29 #include "cmailexternalaccount.h" |
|
30 #include "cmailcpsif.h" |
|
31 #include "cmailcpsutils.h" |
|
32 |
|
33 using namespace EmailInterface; |
|
34 |
|
35 // --------------------------------------------------------- |
|
36 // CMailPluginProxy::NewL |
|
37 // --------------------------------------------------------- |
|
38 // |
|
39 CMailPluginProxy* CMailPluginProxy::NewL( |
|
40 const TInt aPluginId, |
|
41 CMailCpsIf& aPublisher ) |
|
42 { |
|
43 FUNC_LOG; |
|
44 CMailPluginProxy* self = new(ELeave) CMailPluginProxy( aPluginId, aPublisher ); |
|
45 CleanupStack::PushL( self ); |
|
46 self->ConstructL(); |
|
47 CleanupStack::Pop( self ); |
|
48 return self; |
|
49 } |
|
50 |
|
51 // --------------------------------------------------------- |
|
52 // CMailPluginProxy::CMailPluginProxy |
|
53 // --------------------------------------------------------- |
|
54 // |
|
55 CMailPluginProxy::CMailPluginProxy( |
|
56 const TInt aPluginId, |
|
57 CMailCpsIf& aPublisher ) : |
|
58 iPluginId( aPluginId ), |
|
59 iPublisher( aPublisher ) |
|
60 { |
|
61 FUNC_LOG; |
|
62 } |
|
63 |
|
64 // --------------------------------------------------------- |
|
65 // CMailPluginProxy::~CMailPluginProxy |
|
66 // --------------------------------------------------------- |
|
67 // |
|
68 CMailPluginProxy::~CMailPluginProxy() |
|
69 { |
|
70 FUNC_LOG; |
|
71 delete iPlugin; |
|
72 TRAP_IGNORE( RemoveAccountsL() ); |
|
73 iAccounts.ResetAndDestroy(); |
|
74 } |
|
75 |
|
76 // --------------------------------------------------------- |
|
77 // CMailPluginProxy::ConstructL |
|
78 // --------------------------------------------------------- |
|
79 // |
|
80 void CMailPluginProxy::ConstructL() |
|
81 { |
|
82 FUNC_LOG; |
|
83 TUid implUid = TUid::Uid( iPluginId ); |
|
84 iPlugin = EmailInterface::CEmailObserverPlugin::NewL( implUid, this ); |
|
85 } |
|
86 |
|
87 // --------------------------------------------------------- |
|
88 // CMailPluginProxy::EmailObserverEvent |
|
89 // --------------------------------------------------------- |
|
90 // |
|
91 void CMailPluginProxy::EmailObserverEvent( MEmailData& /*aData*/ ) |
|
92 { |
|
93 FUNC_LOG; |
|
94 TRAP_IGNORE( PublishAccountsL() ); |
|
95 } |
|
96 |
|
97 // --------------------------------------------------------- |
|
98 // CMailPluginProxy::PluginId |
|
99 // --------------------------------------------------------- |
|
100 // |
|
101 TInt CMailPluginProxy::PluginId() |
|
102 { |
|
103 FUNC_LOG; |
|
104 return iPluginId; |
|
105 } |
|
106 |
|
107 // --------------------------------------------------------- |
|
108 // CMailPluginProxy::RemoveAccountsL |
|
109 // --------------------------------------------------------- |
|
110 // |
|
111 void CMailPluginProxy::RemoveAccountsL() |
|
112 { |
|
113 FUNC_LOG; |
|
114 while ( iAccounts.Count() ) |
|
115 { |
|
116 ResetAccountL( iAccounts[0]->ContentId() ); |
|
117 delete iAccounts[0]; |
|
118 iAccounts.Remove(0); |
|
119 } |
|
120 } |
|
121 |
|
122 // --------------------------------------------------------- |
|
123 // CMailPluginProxy::ResetAccountL |
|
124 // --------------------------------------------------------- |
|
125 // |
|
126 void CMailPluginProxy::ResetAccountL( const TDesC& aContentId ) |
|
127 { |
|
128 FUNC_LOG; |
|
129 TInt instId = ResolveWidgetInstance( aContentId ); |
|
130 if ( instId >= 0 ) |
|
131 { |
|
132 TFSMailMsgId dummy; |
|
133 iPublisher.PublishMailboxIconL( instId, KNullDesC ); |
|
134 iPublisher.PublishActiveMailboxNameL( instId, 1, KNullDesC, 0, dummy, dummy ); |
|
135 iPublisher.PublishIndicatorIconL( instId, 1, KNullIcon ); |
|
136 |
|
137 ResetMessageRowL( instId, 2 ); // 1st message row |
|
138 ResetMessageRowL( instId, 3 ); // 2nd.. |
|
139 } |
|
140 } |
|
141 |
|
142 // --------------------------------------------------------- |
|
143 // CMailPluginProxy::ResetMessageRowL |
|
144 // --------------------------------------------------------- |
|
145 // |
|
146 void CMailPluginProxy::ResetMessageRowL( const TInt aWidgetInstanceId, const TInt aRow ) |
|
147 { |
|
148 FUNC_LOG; |
|
149 TFSMailMsgId dummy; |
|
150 iPublisher.PublishMailboxIconL( aWidgetInstanceId, aRow, KNullIcon, dummy ); |
|
151 iPublisher.PublishMailDetailL( aWidgetInstanceId, aRow, KNullDesC, ESender ); |
|
152 iPublisher.PublishMailDetailL( aWidgetInstanceId, aRow, KNullDesC, ETime ); |
|
153 } |
|
154 |
|
155 // --------------------------------------------------------- |
|
156 // CMailPluginProxy::SelectOwnAccountsL |
|
157 // --------------------------------------------------------- |
|
158 // |
|
159 void CMailPluginProxy::SelectOwnAccountsL( RPointerArray<CMailExternalAccount>& aAccounts ) |
|
160 { |
|
161 FUNC_LOG; |
|
162 for ( TInt i = 0; i < aAccounts.Count(); i++ ) |
|
163 { |
|
164 if ( aAccounts[i]->PluginId() == iPluginId ) |
|
165 { |
|
166 // own account, take ownership |
|
167 iAccounts.AppendL( aAccounts[i] ); |
|
168 aAccounts.Remove(i); |
|
169 i--; // update loop indexing |
|
170 } |
|
171 } |
|
172 } |
|
173 |
|
174 // --------------------------------------------------------- |
|
175 // CMailPluginProxy::PublishAccountsL |
|
176 // --------------------------------------------------------- |
|
177 // |
|
178 void CMailPluginProxy::PublishAccountsL() |
|
179 { |
|
180 FUNC_LOG; |
|
181 // Loops through all external accounts of this plugin (that are configured |
|
182 // to be published), and calls publish on them |
|
183 for ( TInt i = 0; i < iAccounts.Count(); i++ ) |
|
184 { |
|
185 TInt instId = ResolveWidgetInstance( iAccounts[i]->ContentId() ); |
|
186 if ( instId != KErrNotFound && iPublisher.AllowedToPublish( instId ) ) |
|
187 { |
|
188 PublishAccountL( instId, iAccounts[i]->MailboxId() ); |
|
189 } |
|
190 else |
|
191 { |
|
192 INFO("Correct widget not found, not publishing.."); |
|
193 } |
|
194 } |
|
195 } |
|
196 |
|
197 // --------------------------------------------------------- |
|
198 // CMailPluginProxy::PublishAccountL |
|
199 // --------------------------------------------------------- |
|
200 // |
|
201 void CMailPluginProxy::PublishAccountL( const TInt aWidgetInstanceId, const TInt aMailboxId ) |
|
202 { |
|
203 FUNC_LOG; |
|
204 // Loops through plugin's mailbox array and finds matching mailbox |
|
205 MEmailData& data( iPlugin->EmailDataL() ); |
|
206 RPointerArray<MMailboxData> mailboxes = data.MailboxesL(); |
|
207 for ( TInt j = 0; j < mailboxes.Count(); j++ ) |
|
208 { |
|
209 if ( mailboxes[j]->MailboxId() == aMailboxId ) |
|
210 { |
|
211 PublishAccountL( aWidgetInstanceId, *(mailboxes[j]) ); |
|
212 } |
|
213 } |
|
214 } |
|
215 |
|
216 // --------------------------------------------------------- |
|
217 // CMailPluginProxy::PublishAccountL |
|
218 // --------------------------------------------------------- |
|
219 // |
|
220 void CMailPluginProxy::PublishAccountL( const TInt aWidgetInstanceId, MMailboxData& aMailboxData ) |
|
221 { |
|
222 FUNC_LOG; |
|
223 // 1st row |
|
224 PublishFirstRowL( aWidgetInstanceId, aMailboxData ); |
|
225 |
|
226 // message rows |
|
227 TInt msgCount = aMailboxData.LatestMessagesL().Count(); |
|
228 for ( TInt i = 0; i < KMaxMsgCount; i++ ) |
|
229 { |
|
230 if ( msgCount > i ) |
|
231 { |
|
232 // enough messages for this row |
|
233 PublishMessageRowL( aWidgetInstanceId, *(aMailboxData.LatestMessagesL()[i]), i+2 ); // message-rows start from 2 |
|
234 } |
|
235 else |
|
236 { |
|
237 // make sure this row is empty |
|
238 TFSMailMsgId dummy; |
|
239 iPublisher.PublishMailboxIconL( aWidgetInstanceId, i+2, KNullIcon, dummy ); |
|
240 iPublisher.PublishMailDetailL( aWidgetInstanceId, i+2, KNullDesC, ESender ); |
|
241 iPublisher.PublishMailDetailL( aWidgetInstanceId, i+2, KNullDesC, ETime ); |
|
242 } |
|
243 } |
|
244 } |
|
245 |
|
246 // --------------------------------------------------------- |
|
247 // CMailPluginProxy::PublishMessageL |
|
248 // --------------------------------------------------------- |
|
249 // |
|
250 void CMailPluginProxy::PublishMessageRowL( const TInt aWidgetInstanceId, EmailInterface::MMessageData& aMessageData, const TInt aRow ) |
|
251 { |
|
252 FUNC_LOG; |
|
253 TFSMailMsgId dummy; |
|
254 TInt iconId = TMailCpsUtils::ResolveIcon( |
|
255 aMessageData.Unread(), |
|
256 aMessageData.CalendarMsg(), |
|
257 aMessageData.Attachments(), |
|
258 aMessageData.Priority(), |
|
259 aMessageData.Replied(), |
|
260 aMessageData.Forwarded() ); |
|
261 |
|
262 iPublisher.PublishMailboxIconL( aWidgetInstanceId, aRow, iconId, dummy ); |
|
263 iPublisher.PublishMailDetailL( aWidgetInstanceId, aRow, aMessageData.Sender(), ESender ); |
|
264 HBufC* timeString = CMailCpsHandler::GetMessageTimeStringL( aMessageData.TimeStamp() ); |
|
265 CleanupStack::PushL( timeString ); |
|
266 iPublisher.PublishMailDetailL( aWidgetInstanceId, aRow, *timeString, ETime ); |
|
267 CleanupStack::PopAndDestroy( timeString ); |
|
268 } |
|
269 |
|
270 // --------------------------------------------------------- |
|
271 // CMailPluginProxy::PublishFirstRowL |
|
272 // --------------------------------------------------------- |
|
273 // |
|
274 void CMailPluginProxy::PublishFirstRowL( const TInt aWidgetInstanceId, EmailInterface::MMailboxData& aMailboxData ) |
|
275 { |
|
276 FUNC_LOG; |
|
277 HBufC* firstLineText = ConstructMailboxNameWithMessageCountLC( aMailboxData ); |
|
278 TInt indicator = ResolveIndicatorIcon( aMailboxData ); |
|
279 iPublisher.PublishMailboxIconL( aWidgetInstanceId, aMailboxData.BrandingIcon() ); |
|
280 iPublisher.PublishMailboxNameL( aWidgetInstanceId, *firstLineText, KTriggerEmailUi8 ); |
|
281 iPublisher.PublishIndicatorIconL( aWidgetInstanceId, 1, indicator ); |
|
282 CleanupStack::PopAndDestroy( firstLineText ); |
|
283 } |
|
284 |
|
285 // --------------------------------------------------------- |
|
286 // CMailPluginProxy::ConstructMailboxNameWithMessageCountLC |
|
287 // --------------------------------------------------------- |
|
288 // |
|
289 HBufC* CMailPluginProxy::ConstructMailboxNameWithMessageCountLC( MMailboxData& aMailboxData ) |
|
290 { |
|
291 FUNC_LOG; |
|
292 HBufC* mailboxAndCount( NULL ); |
|
293 TInt unreadCount = UnreadCountL( aMailboxData ); |
|
294 if ( unreadCount > 0 ) |
|
295 { |
|
296 // Arrays must be used when loc string contains indexed parameters |
|
297 CDesCArrayFlat* strings = new CDesCArrayFlat( 1 ); |
|
298 CleanupStack::PushL( strings ); |
|
299 strings->AppendL( aMailboxData.Name() ); // replace "%0U" with mailbox name |
|
300 |
|
301 CArrayFix<TInt>* ints = new(ELeave) CArrayFixFlat<TInt>( 1 ); |
|
302 CleanupStack::PushL( ints ); |
|
303 ints->AppendL( unreadCount ); // replace "%1N" with number of unread messages |
|
304 |
|
305 mailboxAndCount = StringLoader::LoadL( R_EMAILWIDGET_TEXT_MAILBOX_AND_MAILCOUNT, *strings, *ints ); |
|
306 CleanupStack::PopAndDestroy(ints); |
|
307 CleanupStack::PopAndDestroy(strings); |
|
308 CleanupStack::PushL( mailboxAndCount ); |
|
309 } |
|
310 else |
|
311 { |
|
312 // if 0 messages, first line text is pure mailbox name |
|
313 mailboxAndCount = aMailboxData.Name().AllocLC(); |
|
314 } |
|
315 INFO_1("first line: %S", mailboxAndCount); |
|
316 return mailboxAndCount; |
|
317 } |
|
318 |
|
319 // --------------------------------------------------------- |
|
320 // CMailPluginProxy::UnreadCountL |
|
321 // --------------------------------------------------------- |
|
322 // |
|
323 TInt CMailPluginProxy::UnreadCountL( EmailInterface::MMailboxData& aMailboxData ) |
|
324 { |
|
325 FUNC_LOG; |
|
326 TInt count( 0 ); |
|
327 for ( TInt i = 0; i < aMailboxData.LatestMessagesL().Count(); i++ ) |
|
328 { |
|
329 if ( aMailboxData.LatestMessagesL()[i]->Unread() ) |
|
330 { |
|
331 count++; |
|
332 } |
|
333 } |
|
334 return count; |
|
335 } |
|
336 |
|
337 // --------------------------------------------------------------------------- |
|
338 // CMailPluginProxy::ResolveIndicatorIcon |
|
339 // --------------------------------------------------------------------------- |
|
340 // |
|
341 TInt CMailPluginProxy::ResolveIndicatorIcon( EmailInterface::MMailboxData& aMailboxData ) |
|
342 { |
|
343 FUNC_LOG; |
|
344 TInt indicator( 0 ); |
|
345 if ( aMailboxData.Unseen() ) |
|
346 { |
|
347 indicator = EMbmCmailhandlerpluginQgn_stat_message_mail_uni; |
|
348 } |
|
349 else if ( !aMailboxData.IsOutboxEmpty() ) |
|
350 { |
|
351 indicator = EMbmCmailhandlerpluginQgn_indi_cmail_outbox_msg; |
|
352 } |
|
353 else |
|
354 { |
|
355 indicator = KNullIcon; |
|
356 } |
|
357 return indicator; |
|
358 } |
|
359 |
|
360 // --------------------------------------------------------------------------- |
|
361 // CMailPluginProxy::ResolveWidgetInstance |
|
362 // --------------------------------------------------------------------------- |
|
363 // |
|
364 TInt CMailPluginProxy::ResolveWidgetInstance( const TDesC& aContentId ) |
|
365 { |
|
366 FUNC_LOG; |
|
367 TInt id( KErrNotFound ); |
|
368 for ( TInt i = 0; i < iPublisher.iInstIdList.Count(); i++ ) |
|
369 { |
|
370 if ( aContentId.Compare( *(iPublisher.iInstIdList[i]) ) == 0 ) |
|
371 { |
|
372 id = i; |
|
373 } |
|
374 } |
|
375 return id; |
|
376 } |
|
377 |
|
378 // --------------------------------------------------------------------------- |
|
379 // CMailPluginProxy::HasAccount |
|
380 // --------------------------------------------------------------------------- |
|
381 // |
|
382 TBool CMailPluginProxy::HasAccount( const TDesC& aContentId ) |
|
383 { |
|
384 FUNC_LOG; |
|
385 TBool found( EFalse ); |
|
386 for ( TInt i = 0; i < iAccounts.Count(); i++ ) |
|
387 { |
|
388 if ( !( iAccounts[i]->ContentId().Compare( aContentId ) ) ) |
|
389 { |
|
390 found = ETrue; |
|
391 } |
|
392 } |
|
393 return found; |
|
394 } |
|
395 |
|
396 // --------------------------------------------------------------------------- |
|
397 // CMailPluginProxy::LaunchExtAppL |
|
398 // --------------------------------------------------------------------------- |
|
399 // |
|
400 void CMailPluginProxy::LaunchExtAppL( const TDesC& aContentId ) |
|
401 { |
|
402 FUNC_LOG; |
|
403 MMailboxData& mailbox = GetMailboxDataL( GetMailboxId( aContentId ) ); |
|
404 MEmailLaunchParameters& launchParams = mailbox.LaunchParameters(); |
|
405 |
|
406 CEikonEnv* env = CEikonEnv::Static(); |
|
407 TVwsViewId view( launchParams.ApplicationUid(), launchParams.ViewId() ); |
|
408 if ( launchParams.CustomMessageId().iUid == 0 ) |
|
409 { |
|
410 env->EikAppUi()->ActivateViewL( view, launchParams.CustomMessageId(), launchParams.CustomMessage() ); |
|
411 } |
|
412 else |
|
413 { |
|
414 env->EikAppUi()->ActivateViewL( view ); |
|
415 } |
|
416 } |
|
417 |
|
418 // --------------------------------------------------------------------------- |
|
419 // CMailPluginProxy::ResolveMailboxId |
|
420 // --------------------------------------------------------------------------- |
|
421 // |
|
422 TInt CMailPluginProxy::GetMailboxId( const TDesC& aContentId ) |
|
423 { |
|
424 FUNC_LOG; |
|
425 TInt mailboxId( 0 ); |
|
426 for ( TInt i = 0; i < iAccounts.Count(); i++ ) |
|
427 { |
|
428 if ( !(iAccounts[i]->ContentId().Compare( aContentId )) ) |
|
429 { |
|
430 mailboxId = iAccounts[i]->MailboxId(); |
|
431 } |
|
432 } |
|
433 return mailboxId; |
|
434 } |
|
435 |
|
436 // --------------------------------------------------------------------------- |
|
437 // CMailPluginProxy::GetMailboxDataL |
|
438 // --------------------------------------------------------------------------- |
|
439 // |
|
440 EmailInterface::MMailboxData& CMailPluginProxy::GetMailboxDataL( TInt aMailboxId ) |
|
441 { |
|
442 FUNC_LOG; |
|
443 TInt index( KErrNotFound ); |
|
444 RPointerArray<MMailboxData> mailboxes = iPlugin->EmailDataL().MailboxesL(); |
|
445 for ( TInt i = 0; i < mailboxes.Count(); i++ ) |
|
446 { |
|
447 if ( mailboxes[i]->MailboxId() == aMailboxId ) |
|
448 { |
|
449 index = i; |
|
450 } |
|
451 } |
|
452 |
|
453 if ( index == KErrNotFound ) |
|
454 { |
|
455 User::Leave( KErrNotFound ); |
|
456 } |
|
457 |
|
458 return *(mailboxes[index]); |
|
459 } |
|
460 |
|
461 // --------------------------------------------------------------------------- |
|
462 // CMailPluginProxy::SelectAndUpdateAccountsL |
|
463 // --------------------------------------------------------------------------- |
|
464 // |
|
465 void CMailPluginProxy::SelectAndUpdateAccountsL( RPointerArray<CMailExternalAccount>& aAccounts ) |
|
466 { |
|
467 FUNC_LOG; |
|
468 RemoveAccountsL(); |
|
469 SelectOwnAccountsL( aAccounts ); |
|
470 PublishAccountsL(); |
|
471 } |
|
472 |
|
473 // --------------------------------------------------------------------------- |
|
474 // CMailPluginProxy::UpdateAccountL |
|
475 // --------------------------------------------------------------------------- |
|
476 // |
|
477 void CMailPluginProxy::UpdateAccountL( const TDesC& aContentId ) |
|
478 { |
|
479 FUNC_LOG; |
|
480 PublishAccountL( |
|
481 ResolveWidgetInstance( aContentId ), |
|
482 GetMailboxId( aContentId ) ); |
|
483 } |