|
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: The engine class of MCS plugin. |
|
15 * |
|
16 */ |
|
17 |
|
18 // System includes |
|
19 #include <gulicon.h> |
|
20 #include <gslauncher.h> |
|
21 #include <mcsmenufilter.h> |
|
22 #include <mcsmenuoperation.h> |
|
23 #include <mcsmenuiconutility.h> |
|
24 #include <bautils.h> |
|
25 #include <StringLoader.h> |
|
26 #include <aknnotedialog.h> |
|
27 #include <mcspluginres.rsg> |
|
28 #include <apgcli.h> |
|
29 #include <apacmdln.h> |
|
30 #include <gfxtranseffect/gfxtranseffect.h> |
|
31 #include <akntranseffect.h> |
|
32 #include <schemehandler.h> |
|
33 #include <viewcli.h> // For CVwsSessionWrapper |
|
34 #ifdef SYMBIAN_ENABLE_SPLIT_HEADERS |
|
35 #include <viewclipartner.h> |
|
36 #endif |
|
37 #include <aisystemuids.hrh> |
|
38 |
|
39 // User includes |
|
40 #include "carouselpluginengine.h" |
|
41 #include "carouselplugin.h" |
|
42 #include "carouselplugindata.h" |
|
43 #include "carouselpluginuids.hrh" |
|
44 |
|
45 // Constants |
|
46 _LIT( KMyMenuData, "matrixmenudata" ); |
|
47 _LIT( KSkin, "skin" ); |
|
48 _LIT( KMif, "mif" ); |
|
49 _LIT( KResourceDrive, "Z:" ); |
|
50 _LIT( KResourceFile, "mcspluginres.rsc" ); |
|
51 _LIT( KResPath, "\\resource\\" ); |
|
52 _LIT( KMMApplication, "mm://" ); |
|
53 _LIT( KHideExit2, "&exit=hide" ); |
|
54 _LIT( KSetFocusString, "!setfocus?applicationgroup_name=" ); |
|
55 _LIT( KApplicationGroupName, "applicationgroup_name" ); |
|
56 _LIT( KIcon, "icon" ); |
|
57 _LIT( KMenuAttrUndefUid, "0x99999991" ); |
|
58 _LIT( KMenuIconFile, "aimcsplugin.mif" ); |
|
59 _LIT( KMenuBookmarkIconId, "16386" ); |
|
60 _LIT( KMenuBookmarkMaskId, "16387" ); |
|
61 _LIT( KMenuMailboxIconId, "16388" ); |
|
62 _LIT( KMenuMailboxMaskId, "16389" ); |
|
63 _LIT( KMenuTypeMailbox, "menu:mailbox" ); |
|
64 _LIT( KPrefix, "0x" ); |
|
65 |
|
66 const TUid KHomescreenUid = { AI_UID3_AIFW_COMMON }; |
|
67 const TUid KMMUid = { 0x101F4CD2 }; |
|
68 const TUid KMCSCmailUidValue = { 0x2001E277 }; |
|
69 const TUid KMCSCmailMailboxViewIdValue = { 0x2 }; |
|
70 const TUid KBrowserUid = { 0x10008D39 }; |
|
71 |
|
72 // ======== LOCAL FUNCTIONS ======== |
|
73 // ---------------------------------------------------------------------------- |
|
74 // NextIdToken |
|
75 // ---------------------------------------------------------------------------- |
|
76 // |
|
77 static TPtrC NextIdToken( TLex& aLexer ) |
|
78 { |
|
79 aLexer.SkipSpace(); |
|
80 aLexer.Mark(); |
|
81 |
|
82 while( !aLexer.Eos() && !aLexer.Peek().IsSpace() && aLexer.Peek() != ')' ) |
|
83 { |
|
84 aLexer.Inc(); |
|
85 } |
|
86 |
|
87 return aLexer.MarkedToken(); |
|
88 } |
|
89 |
|
90 // ---------------------------------------------------------------------------- |
|
91 // Shows note dailog, with the given resource. |
|
92 // ---------------------------------------------------------------------------- |
|
93 // |
|
94 static void ShowNoteDlgL( TInt aResource ) |
|
95 { |
|
96 HBufC* temp = StringLoader::LoadLC( aResource ); |
|
97 |
|
98 CAknNoteDialog* dialog = new (ELeave) CAknNoteDialog( |
|
99 CAknNoteDialog::EConfirmationTone, |
|
100 CAknNoteDialog::ENoTimeout ); |
|
101 CleanupStack::PushL( dialog ); |
|
102 dialog->SetTextL( temp->Des() ); |
|
103 dialog->ExecuteDlgLD( R_MCS_DISABLE_OPEN_ITEM_DLG ); |
|
104 CleanupStack::Pop( dialog ); |
|
105 CleanupStack::PopAndDestroy( temp ); |
|
106 } |
|
107 |
|
108 // ---------------------------------------------------------------------------- |
|
109 // Parses uid in Hexadecimal format from the given string. |
|
110 // ---------------------------------------------------------------------------- |
|
111 // |
|
112 TUid ParseHexUidFromString(const TDesC& aUidString ) |
|
113 { |
|
114 TUid uid( KNullUid ); |
|
115 const TInt pos( aUidString.FindF( KPrefix ) ); |
|
116 |
|
117 if ( pos != KErrNotFound ) |
|
118 { |
|
119 TLex lex( aUidString.Mid( pos + KPrefix().Length() ) ); |
|
120 |
|
121 // Hex parsing needs unsigned int |
|
122 TUint32 value( 0 ); |
|
123 const TInt parseResult( lex.Val( value, EHex ) ); |
|
124 |
|
125 if ( parseResult == KErrNone ) |
|
126 { |
|
127 TInt32 value32( value ); |
|
128 uid.iUid = value32; |
|
129 } |
|
130 } |
|
131 return uid; |
|
132 } |
|
133 |
|
134 // ---------------------------------------------------------------------------- |
|
135 // Start transition effect. User has launched the application with the given uid. |
|
136 // ---------------------------------------------------------------------------- |
|
137 // |
|
138 void StartEffect( TUid aUid ) |
|
139 { |
|
140 //start a full screen effect |
|
141 GfxTransEffect::BeginFullScreen( |
|
142 AknTransEffect::EApplicationStart, |
|
143 TRect(), |
|
144 AknTransEffect::EParameterType, |
|
145 AknTransEffect::GfxTransParam( aUid, |
|
146 AknTransEffect::TParameter::EActivateExplicitContinue )); |
|
147 } |
|
148 |
|
149 // ============================ MEMBER FUNCTIONS =============================== |
|
150 // ---------------------------------------------------------------------------- |
|
151 // CMCSPluginEngine::CMCSPluginEngine |
|
152 // |
|
153 // ---------------------------------------------------------------------------- |
|
154 // |
|
155 CCarouselPluginEngine::CCarouselPluginEngine( CCarouselPlugin& aPlugin, |
|
156 const TDesC8& aInstanceUid ) |
|
157 : iPlugin( aPlugin ), iInstanceUid( aInstanceUid ) |
|
158 { |
|
159 } |
|
160 |
|
161 // ---------------------------------------------------------------------------- |
|
162 // CMCSPluginEngine::NewL |
|
163 // |
|
164 // ---------------------------------------------------------------------------- |
|
165 // |
|
166 CCarouselPluginEngine* CCarouselPluginEngine::NewL( CCarouselPlugin& aPlugin, |
|
167 const TDesC8& aInstanceUid ) |
|
168 { |
|
169 CCarouselPluginEngine* self = |
|
170 new( ELeave ) CCarouselPluginEngine( aPlugin, aInstanceUid ); |
|
171 |
|
172 CleanupStack::PushL( self ); |
|
173 self->ConstructL(); |
|
174 CleanupStack::Pop( self ); |
|
175 |
|
176 return self; |
|
177 } |
|
178 |
|
179 // ---------------------------------------------------------------------------- |
|
180 // CMCSPluginEngine::ConstructL |
|
181 // |
|
182 // ---------------------------------------------------------------------------- |
|
183 // |
|
184 void CCarouselPluginEngine::ConstructL() |
|
185 { |
|
186 TFullName resourceFile( KResourceDrive ); |
|
187 resourceFile.Append( KResPath ); |
|
188 resourceFile.Append( KResourceFile ); |
|
189 BaflUtils::NearestLanguageFile( |
|
190 CCoeEnv::Static()->FsSession(), |
|
191 resourceFile ); |
|
192 iResourceOffset = |
|
193 CCoeEnv::Static()->AddResourceFileL( resourceFile ); |
|
194 InitL(); |
|
195 StartObservingL(); |
|
196 |
|
197 // Get "Undefined" item |
|
198 CMenuFilter* filter = CMenuFilter::NewL(); |
|
199 CleanupStack::PushL( filter ); |
|
200 filter->HaveAttributeL( KMenuAttrUid, KMenuAttrUndefUid ); |
|
201 iUndefinedItemHeader = FindMenuItemL( *filter ); |
|
202 CleanupStack::PopAndDestroy( filter ); |
|
203 iUndefinedItem = CMenuItem::OpenL( iMenu, iUndefinedItemHeader ); |
|
204 } |
|
205 |
|
206 // ---------------------------------------------------------------------------- |
|
207 // CMCSPluginEngine::~CMCSPluginEngine |
|
208 // |
|
209 // ---------------------------------------------------------------------------- |
|
210 // |
|
211 CCarouselPluginEngine::~CCarouselPluginEngine() |
|
212 { |
|
213 StopObserving(); |
|
214 |
|
215 delete iPluginData; |
|
216 |
|
217 // Notifier close has to be before iMenu close |
|
218 iNotifier.Close(); |
|
219 iMenu.Close(); |
|
220 delete iWatcher; |
|
221 delete iNotifyWatcher; |
|
222 |
|
223 CCoeEnv::Static()->DeleteResourceFile( iResourceOffset ); |
|
224 |
|
225 delete iUndefinedItem; |
|
226 } |
|
227 |
|
228 // --------------------------------------------------------------------------- |
|
229 // CMCSPluginEngine::InitL |
|
230 // |
|
231 // --------------------------------------------------------------------------- |
|
232 // |
|
233 void CCarouselPluginEngine::InitL() |
|
234 { |
|
235 iMenu.OpenL( KMyMenuData ); |
|
236 iPluginData = CCarouselPluginData::NewL( *this, iInstanceUid ); |
|
237 iWatcher = CCarouselPluginWatcher::NewL( CCarouselPluginWatcher::EOperation ); |
|
238 |
|
239 TInt err( iNotifier.Open( iMenu ) ); |
|
240 |
|
241 if ( err == KErrNone ) |
|
242 { |
|
243 iNotifyWatcher = CCarouselPluginWatcher::NewL( CCarouselPluginWatcher::ENotify ); |
|
244 |
|
245 iNotifier.Notify( 0, |
|
246 RMenuNotifier::EItemsAddedRemoved, |
|
247 iNotifyWatcher->iStatus ); |
|
248 iNotifyWatcher->WatchNotify( this ); |
|
249 } |
|
250 } |
|
251 |
|
252 // --------------------------------------------------------------------------- |
|
253 // CMCSPluginEngine::StartObservingL |
|
254 // |
|
255 // --------------------------------------------------------------------------- |
|
256 // |
|
257 void CCarouselPluginEngine::StartObservingL() |
|
258 { |
|
259 // registering to mailbox db. changes observing |
|
260 iMsvSession = CMsvSession::OpenAsObserverL( *this ); |
|
261 } |
|
262 |
|
263 // --------------------------------------------------------------------------- |
|
264 // CMCSPluginEngine::StopObserving |
|
265 // |
|
266 // --------------------------------------------------------------------------- |
|
267 // |
|
268 void CCarouselPluginEngine::StopObserving() |
|
269 { |
|
270 delete iMsvSession; |
|
271 iMsvSession = NULL; |
|
272 } |
|
273 |
|
274 // --------------------------------------------------------------------------- |
|
275 // CMCSPluginEngine::MenuDataL |
|
276 // |
|
277 // --------------------------------------------------------------------------- |
|
278 // |
|
279 CCarouselData& CCarouselPluginEngine::MenuDataL( const TInt& aIndex ) |
|
280 { |
|
281 return iPluginData->DataItemL( aIndex ); |
|
282 } |
|
283 |
|
284 // --------------------------------------------------------------------------- |
|
285 // CMCSPluginEngine::MenuItemCount |
|
286 // |
|
287 // --------------------------------------------------------------------------- |
|
288 // |
|
289 TInt CCarouselPluginEngine::MenuItemCount() |
|
290 { |
|
291 return iPluginData->DataCount(); |
|
292 } |
|
293 |
|
294 // --------------------------------------------------------------------------- |
|
295 // CMCSPluginEngine::FindMenuItemL |
|
296 // Returns the menu item header, which matches the given filter. |
|
297 // --------------------------------------------------------------------------- |
|
298 // |
|
299 TMenuItem CCarouselPluginEngine::FindMenuItemL( CMenuFilter& aFilter ) |
|
300 { |
|
301 TMenuItem item; |
|
302 const TInt root( iMenu.RootFolderL() ); |
|
303 |
|
304 RArray<TMenuItem> items; |
|
305 CleanupClosePushL( items ); |
|
306 |
|
307 iMenu.GetItemsL( items, root, &aFilter, ETrue ); |
|
308 |
|
309 if ( items.Count() > 0 ) |
|
310 { |
|
311 item = items[0]; |
|
312 } |
|
313 |
|
314 CleanupStack::PopAndDestroy( &items ); |
|
315 |
|
316 return item; |
|
317 } |
|
318 |
|
319 // --------------------------------------------------------------------------- |
|
320 // CMCSPluginEngine::FetchMenuItemL |
|
321 // Returns the actual menu item for the given header. |
|
322 // --------------------------------------------------------------------------- |
|
323 // |
|
324 CMenuItem* CCarouselPluginEngine::FetchMenuItemL( CCarouselData& aData ) |
|
325 { |
|
326 CMenuItem* item = NULL; |
|
327 |
|
328 TRAP_IGNORE( item = CMenuItem::OpenL( iMenu, aData.MenuItem().Id() ) ); |
|
329 |
|
330 if( item ) |
|
331 { |
|
332 return item; |
|
333 } |
|
334 |
|
335 if( aData.MenuItem().Type() == KMenuTypeUrl ) |
|
336 { |
|
337 item = CreateBkmItemL( aData ); |
|
338 } |
|
339 else if( aData.MenuItem().Type() == KMenuTypeMailbox ) |
|
340 { |
|
341 item = CreateMailboxItemL( aData); |
|
342 } |
|
343 |
|
344 return item; |
|
345 } |
|
346 |
|
347 // --------------------------------------------------------------------------- |
|
348 // |
|
349 // --------------------------------------------------------------------------- |
|
350 // |
|
351 CMenuItem* CCarouselPluginEngine::CreateBkmItemL( CCarouselData& aData ) |
|
352 { |
|
353 CMenuItem* item( NULL ); |
|
354 if( aData.MenuItem().Id() != KErrNotFound ) |
|
355 { |
|
356 item = CMenuItem::CreateL( iMenu, KMenuTypeUrl, 0, 0 ); |
|
357 CleanupStack::PushL( item ); |
|
358 item->SetAttributeL( KMenuAttrLongName, aData.Name() ); |
|
359 item->SetAttributeL( KMenuAttrIconFile, KMenuIconFile ); |
|
360 item->SetAttributeL( KMenuAttrIconId, KMenuBookmarkIconId ); |
|
361 item->SetAttributeL( KMenuAttrMaskId, KMenuBookmarkMaskId ); |
|
362 CleanupStack::Pop( item ); |
|
363 } |
|
364 return item; |
|
365 } |
|
366 |
|
367 // --------------------------------------------------------------------------- |
|
368 // |
|
369 // --------------------------------------------------------------------------- |
|
370 // |
|
371 CMenuItem* CCarouselPluginEngine::CreateMailboxItemL( CCarouselData& aData ) |
|
372 { |
|
373 CMenuItem* item( NULL ); |
|
374 if( aData.MenuItem().Id() != KErrNotFound ) |
|
375 { |
|
376 item = CMenuItem::CreateL( iMenu, KMenuTypeMailbox, 0, 0 ); |
|
377 CleanupStack::PushL( item ); |
|
378 item->SetAttributeL( KMenuAttrLongName, aData.Name() ); |
|
379 item->SetAttributeL( KMenuAttrIconFile, KMenuIconFile ); |
|
380 item->SetAttributeL( KMenuAttrIconId, KMenuMailboxIconId ); |
|
381 item->SetAttributeL( KMenuAttrMaskId, KMenuMailboxMaskId ); |
|
382 CleanupStack::Pop( item ); |
|
383 } |
|
384 return item; |
|
385 } |
|
386 |
|
387 // --------------------------------------------------------------------------- |
|
388 // CMCSPluginEngine::ItemIconL |
|
389 // Returns MCS default icon if attribute is 'icon' else parses the |
|
390 // skin definition from attribute and sets attributes to aMenuItem. |
|
391 // --------------------------------------------------------------------------- |
|
392 // |
|
393 CGulIcon* CCarouselPluginEngine::ItemIconL( CMenuItem* aMenuItem, |
|
394 const TDesC& aAttr ) |
|
395 { |
|
396 |
|
397 CMenuItem* menuItem; |
|
398 |
|
399 // check if item exists in MCS |
|
400 if ( aMenuItem ) |
|
401 { |
|
402 TUint32 flags = aMenuItem->Flags(); |
|
403 TUint32 isHidden = flags & TMenuItem::EHidden; |
|
404 TUint32 isMissing = flags & TMenuItem::EMissing; |
|
405 |
|
406 if ( iUndefinedItem && ( isHidden || isMissing ) ) |
|
407 { |
|
408 menuItem = iUndefinedItem; |
|
409 } |
|
410 else |
|
411 { |
|
412 menuItem = aMenuItem; |
|
413 } |
|
414 } |
|
415 else |
|
416 { |
|
417 // item not found in MCS. Use Undefined Icon |
|
418 menuItem = iUndefinedItem; |
|
419 } |
|
420 |
|
421 CAknIcon* icon( NULL ); |
|
422 CGulIcon* gIcon( NULL ); |
|
423 TBool exists( ETrue ); |
|
424 |
|
425 if ( aAttr != KIcon ) |
|
426 { |
|
427 // Resolve secondary icon definition from attribute |
|
428 TPtrC iconDef( menuItem->GetAttributeL( aAttr, exists ) ); |
|
429 |
|
430 if ( exists ) |
|
431 { |
|
432 exists = ConstructMenuItemForIconL( iconDef, *menuItem ); |
|
433 } |
|
434 } |
|
435 |
|
436 if ( exists ) |
|
437 { |
|
438 icon = MenuIconUtility::GetItemIconL( *menuItem ); |
|
439 |
|
440 if ( icon ) |
|
441 { |
|
442 CleanupStack::PushL( icon ); |
|
443 |
|
444 gIcon = CGulIcon::NewL( icon->Bitmap(), icon->Mask() ); |
|
445 |
|
446 // Detach and delete |
|
447 icon->SetBitmap( NULL ); |
|
448 icon->SetMask( NULL ); |
|
449 |
|
450 CleanupStack::PopAndDestroy( icon ); |
|
451 } |
|
452 } |
|
453 |
|
454 return gIcon; |
|
455 } |
|
456 |
|
457 // --------------------------------------------------------------------------- |
|
458 // CMCSPluginEngine::ItemTextL |
|
459 // Returns text string for the given attribute |
|
460 // --------------------------------------------------------------------------- |
|
461 // |
|
462 TPtrC CCarouselPluginEngine::ItemTextL( CMenuItem* aMenuItem, const TDesC& aAttr ) |
|
463 { |
|
464 |
|
465 CMenuItem* menuItem; |
|
466 |
|
467 // check if item exists in MCS |
|
468 if ( aMenuItem ) |
|
469 { |
|
470 TUint32 flags = aMenuItem->Flags(); |
|
471 TUint32 isHidden = flags & TMenuItem::EHidden; |
|
472 TUint32 isMissing = flags & TMenuItem::EMissing; |
|
473 |
|
474 // if item is hidden or missing (mmc card removed) |
|
475 // use "Undefined" text instead |
|
476 if ( iUndefinedItem && ( isHidden || isMissing ) ) |
|
477 { |
|
478 menuItem = iUndefinedItem; |
|
479 } |
|
480 else |
|
481 { |
|
482 menuItem = aMenuItem; |
|
483 } |
|
484 } |
|
485 else |
|
486 { |
|
487 // item not found in MCS. Use "Undefined" text |
|
488 menuItem = iUndefinedItem; |
|
489 } |
|
490 |
|
491 TBool exists( KErrNotFound ); |
|
492 |
|
493 TPtrC name( menuItem->GetAttributeL( aAttr, exists ) ); |
|
494 |
|
495 if ( exists ) |
|
496 { |
|
497 return name; |
|
498 } |
|
499 |
|
500 return KNullDesC(); |
|
501 } |
|
502 |
|
503 // --------------------------------------------------------------------------- |
|
504 // CMCSPluginEngine::LaunchItemL |
|
505 // Calls the open command for the given menu item header |
|
506 // --------------------------------------------------------------------------- |
|
507 // |
|
508 void CCarouselPluginEngine::LaunchItemL( const TInt& aIndex ) |
|
509 { |
|
510 if ( iBackupRestore ) |
|
511 { |
|
512 ShowNoteDlgL( R_MCS_DISABLE_OPEN_ITEM ); |
|
513 return; |
|
514 } |
|
515 |
|
516 CCarouselData& dataItem( iPluginData->DataItemL( aIndex ) ); |
|
517 // run item based on its type |
|
518 TPtrC type( dataItem.MenuItem().Type()); |
|
519 |
|
520 // run folder |
|
521 if ( type == KMenuTypeFolder ) |
|
522 { |
|
523 LaunchFolderItemL( dataItem ); |
|
524 } |
|
525 else if( type == KMenuTypeUrl ) |
|
526 { |
|
527 LaunchBookmarkItemL( dataItem ); |
|
528 } |
|
529 else if( type == KMenuTypeMailbox ) |
|
530 { |
|
531 LaunchMailboxItemL( dataItem ); |
|
532 } |
|
533 else |
|
534 { |
|
535 LaunchMCSItemL( dataItem ); |
|
536 } |
|
537 } |
|
538 |
|
539 // --------------------------------------------------------------------------- |
|
540 // |
|
541 // --------------------------------------------------------------------------- |
|
542 // |
|
543 void CCarouselPluginEngine::LaunchFolderItemL( CCarouselData& aData ) |
|
544 { |
|
545 CMenuItem* item = NULL; |
|
546 TRAP_IGNORE( item = CMenuItem::OpenL( iMenu, aData.MenuItem().Id() ) ); |
|
547 |
|
548 // item does not exist at all in MCS |
|
549 if ( item == NULL ) |
|
550 { |
|
551 ShowNoteDlgL( R_MCS_DISABLE_OPEN_ITEM_MISSING ); |
|
552 return; |
|
553 } |
|
554 |
|
555 CleanupStack::PushL( item ); |
|
556 |
|
557 StartEffect( KMMUid ); |
|
558 |
|
559 // message for MM application |
|
560 HBufC8* message; |
|
561 |
|
562 // prepare message for launching folder |
|
563 TBool hasApplicationGroupName( EFalse ); |
|
564 |
|
565 TPtrC applicationGroupName( item->GetAttributeL( |
|
566 KApplicationGroupName, hasApplicationGroupName ) ); |
|
567 |
|
568 if ( !hasApplicationGroupName ) |
|
569 { |
|
570 return; |
|
571 } |
|
572 |
|
573 message = HBufC8::NewLC( KMMApplication().Length() + |
|
574 KSetFocusString().Length() + |
|
575 applicationGroupName.Length() + |
|
576 KHideExit2().Length() ); |
|
577 |
|
578 message->Des().Copy( KMMApplication ); |
|
579 message->Des().Append( KSetFocusString ); |
|
580 message->Des().Append( applicationGroupName ); |
|
581 message->Des().Append( KHideExit2 ); |
|
582 |
|
583 // find MM application |
|
584 TApaTaskList taskList( CCoeEnv::Static()->WsSession() ); |
|
585 TApaTask task( taskList.FindApp( KMMUid ) ); |
|
586 |
|
587 if ( task.Exists() ) |
|
588 { |
|
589 // MM is already running in background - send APA Message |
|
590 task.SendMessage( |
|
591 TUid::Uid( KUidApaMessageSwitchOpenFileValue ), *message ); |
|
592 } |
|
593 else |
|
594 { |
|
595 // MM not running yet - use Command Line Tail |
|
596 RApaLsSession appArcSession; |
|
597 CleanupClosePushL( appArcSession ); |
|
598 |
|
599 User::LeaveIfError( appArcSession.Connect() ); |
|
600 |
|
601 TApaAppInfo appInfo; |
|
602 TInt err( appArcSession.GetAppInfo( appInfo, KMMUid ) ); |
|
603 |
|
604 if ( err == KErrNone ) |
|
605 { |
|
606 CApaCommandLine* cmdLine = CApaCommandLine::NewLC(); |
|
607 cmdLine->SetExecutableNameL( appInfo.iFullName ); |
|
608 cmdLine->SetCommandL( EApaCommandRun ); |
|
609 cmdLine->SetTailEndL( *message ); |
|
610 appArcSession.StartApp( *cmdLine ); |
|
611 CleanupStack::PopAndDestroy( cmdLine ); |
|
612 } |
|
613 CleanupStack::PopAndDestroy( &appArcSession ); |
|
614 } |
|
615 CleanupStack::PopAndDestroy( message ); |
|
616 CleanupStack::PopAndDestroy( item ); |
|
617 } |
|
618 |
|
619 // --------------------------------------------------------------------------- |
|
620 // |
|
621 // --------------------------------------------------------------------------- |
|
622 // |
|
623 void CCarouselPluginEngine::LaunchBookmarkItemL( CCarouselData& aData ) |
|
624 { |
|
625 StartEffect( KBrowserUid ); |
|
626 |
|
627 CSchemeHandler* urlHandler = CSchemeHandler::NewL( aData.Value()); |
|
628 CleanupStack::PushL( urlHandler ); |
|
629 urlHandler->HandleUrlStandaloneL(); |
|
630 CleanupStack::PopAndDestroy( urlHandler ); |
|
631 } |
|
632 |
|
633 // --------------------------------------------------------------------------- |
|
634 // |
|
635 // --------------------------------------------------------------------------- |
|
636 // |
|
637 void CCarouselPluginEngine::LaunchMailboxItemL( CCarouselData& aData ) |
|
638 { |
|
639 TInt id( aData.MenuItem().Id()); |
|
640 if ( id == KErrNotFound ) |
|
641 { |
|
642 ShowNoteDlgL( R_MCS_DISABLE_OPEN_ITEM_MISSING ); |
|
643 return; |
|
644 } |
|
645 |
|
646 StartEffect( KMCSCmailUidValue ); |
|
647 |
|
648 TUid uId = TUid::Uid( id ); |
|
649 const TVwsViewId viewId( KMCSCmailUidValue, KMCSCmailMailboxViewIdValue ); |
|
650 CVwsSessionWrapper* vwsSession = CVwsSessionWrapper::NewL(); |
|
651 vwsSession->CreateActivateViewEvent( viewId, uId, KNullDesC8() ); |
|
652 delete vwsSession; |
|
653 } |
|
654 |
|
655 // --------------------------------------------------------------------------- |
|
656 // |
|
657 // --------------------------------------------------------------------------- |
|
658 // |
|
659 void CCarouselPluginEngine::LaunchMCSItemL( CCarouselData& aData ) |
|
660 { |
|
661 if( iWatcher->IsActive()) |
|
662 { |
|
663 return; |
|
664 } |
|
665 CMenuItem* item = NULL; |
|
666 TRAP_IGNORE( item = CMenuItem::OpenL( iMenu, aData.MenuItem().Id() ) ); |
|
667 |
|
668 // item does not exist at all in MCS |
|
669 if ( item == NULL ) |
|
670 { |
|
671 ShowNoteDlgL( R_MCS_DISABLE_OPEN_ITEM_MISSING ); |
|
672 return; |
|
673 } |
|
674 |
|
675 CleanupStack::PushL( item ); |
|
676 |
|
677 TBool attrExists = ETrue; |
|
678 TPtrC uid = item->GetAttributeL( KMenuAttrUid, attrExists ); |
|
679 |
|
680 // trying to run hidden or missing application (e.g. unistalled app |
|
681 // or app on MMC which was removed ) |
|
682 // -> We display a note for a user that this is not possible¨ |
|
683 TUint32 isHidden = item->Flags() & TMenuItem::EHidden; |
|
684 TUint32 isMissing = item->Flags() & TMenuItem::EMissing; |
|
685 |
|
686 if ( ( attrExists && uid == KMenuAttrUndefUid ) || isHidden || isMissing ) |
|
687 { |
|
688 CleanupStack::PopAndDestroy( item ); |
|
689 ShowNoteDlgL( R_MCS_DISABLE_OPEN_ITEM_MISSING ); |
|
690 return; |
|
691 } |
|
692 |
|
693 if ( attrExists ) |
|
694 { |
|
695 StartEffect( ParseHexUidFromString( uid )); |
|
696 } |
|
697 |
|
698 // run application/shortcut |
|
699 CMenuOperation* operation( item->HandleCommandL( |
|
700 KMenuCmdOpen, KNullDesC8, iWatcher->iStatus ) ); |
|
701 iWatcher->Watch( operation ); |
|
702 CleanupStack::PopAndDestroy( item ); |
|
703 } |
|
704 |
|
705 // --------------------------------------------------------------------------- |
|
706 // CMCSPluginEngine::HandleNotifyL |
|
707 // Handle the change in Menu Content |
|
708 // --------------------------------------------------------------------------- |
|
709 // |
|
710 void CCarouselPluginEngine::HandleNotifyL() |
|
711 { |
|
712 TInt count( iPluginData->DataCount() ); |
|
713 |
|
714 for ( TInt i = 0; i < count; i++ ) |
|
715 { |
|
716 CCarouselData& data( iPluginData->DataItemL( i ) ); |
|
717 data.SetDirty( ETrue ); |
|
718 } |
|
719 |
|
720 iPlugin.PublishL(); |
|
721 |
|
722 // Notification must be activated again |
|
723 iNotifyWatcher->Cancel(); |
|
724 iNotifier.Notify( 0, |
|
725 RMenuNotifier::EItemsAddedRemoved, |
|
726 iNotifyWatcher->iStatus ); |
|
727 |
|
728 iNotifyWatcher->WatchNotify( this ); |
|
729 } |
|
730 |
|
731 // --------------------------------------------------------------------------- |
|
732 // CMCSPluginEngine::HandleSessionEventL |
|
733 // Handles an event from the message server. |
|
734 // --------------------------------------------------------------------------- |
|
735 // |
|
736 void CCarouselPluginEngine::HandleSessionEventL( TMsvSessionEvent aEvent, |
|
737 TAny* aArg1, TAny* /*aArg2*/, TAny* /*aArg3*/) |
|
738 { |
|
739 switch ( aEvent ) |
|
740 { |
|
741 case EMsvEntriesDeleted: |
|
742 { |
|
743 CMsvEntrySelection* sel = static_cast<CMsvEntrySelection*>( aArg1 ); |
|
744 TInt count( sel->Count()); |
|
745 for( TInt i = 0; i < count; i++ ) |
|
746 { |
|
747 iPluginData->RemoveDataL( sel->At( i ) ); |
|
748 } |
|
749 } |
|
750 break; |
|
751 default: |
|
752 break; |
|
753 } |
|
754 } |
|
755 |
|
756 // --------------------------------------------------------------------------- |
|
757 // CMCSPluginEngine::SetBackupRestore |
|
758 // |
|
759 // --------------------------------------------------------------------------- |
|
760 // |
|
761 void CCarouselPluginEngine::SetBackupRestore( TBool aBackupRestore ) |
|
762 { |
|
763 iBackupRestore = aBackupRestore; |
|
764 } |
|
765 |
|
766 // --------------------------------------------------------------------------- |
|
767 // CMCSPluginEngine::ShowSettingsL |
|
768 // Launch General Settings plugin |
|
769 // --------------------------------------------------------------------------- |
|
770 // |
|
771 void CCarouselPluginEngine::ShowSettingsL() |
|
772 { |
|
773 TUid uid = {AI_UID_ECOM_IMPLEMENTATION_SETTINGS_MCSPLUGIN}; |
|
774 |
|
775 CGSLauncher* launcher = CGSLauncher::NewLC(); |
|
776 launcher->LaunchGSViewL ( uid, KHomescreenUid, iInstanceUid ); |
|
777 CleanupStack::PopAndDestroy( launcher ); |
|
778 } |
|
779 |
|
780 // --------------------------------------------------------------------------- |
|
781 // CMCSPluginEngine::ConstructMenuItemForIconL |
|
782 // Syntax: skin(major minor):mif(filename bimapId maskId) |
|
783 // --------------------------------------------------------------------------- |
|
784 // |
|
785 TBool CCarouselPluginEngine::ConstructMenuItemForIconL( const TDesC& aPath, |
|
786 CMenuItem& aMenuItem ) |
|
787 { |
|
788 TInt pos( aPath.Locate( ':' ) ); |
|
789 if ( pos == KErrNotFound ) |
|
790 { |
|
791 pos = aPath.Length(); |
|
792 } |
|
793 TPtrC skin( aPath.Left( pos ) ); |
|
794 TInt sf( skin.FindF( KSkin ) ); |
|
795 |
|
796 if ( sf == KErrNotFound ) |
|
797 { |
|
798 return EFalse; |
|
799 } |
|
800 |
|
801 TPtrC temp( skin.Mid( sf + KSkin().Length() ) ); |
|
802 TLex input( temp ); |
|
803 input.SkipSpace(); |
|
804 |
|
805 if ( !input.Eos() && input.Peek() == '(' ) |
|
806 { |
|
807 input.Inc(); |
|
808 } |
|
809 TPtrC majorId( NextIdToken( input ) ); |
|
810 TPtrC minorId( NextIdToken( input ) ); |
|
811 |
|
812 aMenuItem.SetAttributeL( KMenuAttrIconSkinMajorId, majorId ); |
|
813 aMenuItem.SetAttributeL( KMenuAttrIconSkinMinorId, minorId ); |
|
814 |
|
815 if ( aPath.Length() > pos && |
|
816 ( aPath.Mid( pos + 1 ).FindF( KMif ) != KErrNotFound ) ) |
|
817 { |
|
818 TPtrC mif( aPath.Mid( pos + 1 ) ); |
|
819 TInt mf( mif.FindF( KMif ) ); |
|
820 |
|
821 TLex input1( mif.Mid( mf + KMif().Length() ) ); |
|
822 input1.SkipSpace(); |
|
823 |
|
824 if ( !input1.Eos() && input1.Peek() == '(' ) |
|
825 { |
|
826 input1.Inc(); |
|
827 } |
|
828 |
|
829 TPtrC file( NextIdToken( input1 ) ); |
|
830 TPtrC bitmapId( NextIdToken( input1 ) ); |
|
831 TPtrC maskId( NextIdToken( input1 ) ); |
|
832 |
|
833 aMenuItem.SetAttributeL( KMenuAttrIconFile, file ); |
|
834 aMenuItem.SetAttributeL( KMenuAttrIconId, bitmapId ); |
|
835 aMenuItem.SetAttributeL( KMenuAttrMaskId, maskId ); |
|
836 } |
|
837 |
|
838 return ETrue; |
|
839 } |
|
840 |
|
841 // End of file |