|         |      1 /* | 
|         |      2 * Copyright (c) 2004 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:   | 
|         |     15 *      Implementation of Scheme handler interface implementation  | 
|         |     16 *      for localapp: scheme | 
|         |     17 * | 
|         |     18 */ | 
|         |     19  | 
|         |     20  | 
|         |     21  | 
|         |     22 // INCLUDE FILES | 
|         |     23  | 
|         |     24 #include "LocalAppHandler.h" | 
|         |     25 #include "SchemeDefs.h" | 
|         |     26 #include "SchemeDispLogger.h" | 
|         |     27 #include "MmsToHandler.h" | 
|         |     28 #include "SmsHandler.h" | 
|         |     29 #include <ecom.h>		// For REComSession | 
|         |     30 #include <eikenv.h> | 
|         |     31 #include <DocumentHandler.h> | 
|         |     32 #include <apgcli.h> | 
|         |     33 #include <apparc.h> | 
|         |     34 #include <eikdoc.h> | 
|         |     35 #include <eikproc.h> | 
|         |     36 #include <f32file.h> | 
|         |     37 #include <txtrich.h> | 
|         |     38 #include <eikappui.h>       | 
|         |     39 #include <apgtask.h>        // for TApaTaskList | 
|         |     40  | 
|         |     41 // ================= CONSTANTS ======================= | 
|         |     42  | 
|         |     43  | 
|         |     44 // ================= MEMBER FUNCTIONS ======================= | 
|         |     45  | 
|         |     46 // --------------------------------------------------------- | 
|         |     47 // CLocalAppHandler::NewL() | 
|         |     48 // --------------------------------------------------------- | 
|         |     49 // | 
|         |     50 CLocalAppHandler* CLocalAppHandler::NewL( const TDesC& aUrl ) | 
|         |     51 	{ | 
|         |     52 	CLOG_ENTERFN( "CLocalAppHandler::NewL()" ); | 
|         |     53  | 
|         |     54 	CLocalAppHandler* self = new( ELeave ) CLocalAppHandler(); | 
|         |     55 	CleanupStack::PushL( self ); | 
|         |     56 	self->ConstructL( aUrl ); | 
|         |     57 	CleanupStack::Pop( self ); | 
|         |     58  | 
|         |     59 	CLOG_LEAVEFN( "CLocalAppHandler::NewL()" ); | 
|         |     60  | 
|         |     61 	return self; | 
|         |     62 	} | 
|         |     63  | 
|         |     64 // --------------------------------------------------------- | 
|         |     65 // CLocalAppHandler::~CLocalAppHandler() | 
|         |     66 // --------------------------------------------------------- | 
|         |     67 // | 
|         |     68 CLocalAppHandler::~CLocalAppHandler() | 
|         |     69 	{ | 
|         |     70 	CLOG_ENTERFN( "CLocalAppHandler::~CLocalAppHandler()" ); | 
|         |     71  | 
|         |     72 	CLOG_LEAVEFN( "CLocalAppHandler::~CLocalAppHandler()" ); | 
|         |     73 	} | 
|         |     74  | 
|         |     75 // --------------------------------------------------------- | 
|         |     76 // CLocalAppHandler::CLocalAppHandler() | 
|         |     77 // --------------------------------------------------------- | 
|         |     78 // | 
|         |     79 CLocalAppHandler::CLocalAppHandler() : CBaseHandler(), iToday( EFalse ), iEmbedded( EFalse ) | 
|         |     80 	{ | 
|         |     81 	// Deliberately do nothing here :  | 
|         |     82 	// See ConstructL() for initialisation completion. | 
|         |     83 	} | 
|         |     84  | 
|         |     85 // --------------------------------------------------------- | 
|         |     86 // CLocalAppHandler::ConstructL() | 
|         |     87 // --------------------------------------------------------- | 
|         |     88 // | 
|         |     89 void CLocalAppHandler::ConstructL( const TDesC& aUrl ) | 
|         |     90 	{ | 
|         |     91 	CLOG_ENTERFN( "CLocalAppHandler::ConstructL()" ); | 
|         |     92  | 
|         |     93 	BaseConstructL( aUrl ); | 
|         |     94 	 | 
|         |     95 	CLOG_LEAVEFN( "CLocalAppHandler::ConstructL()" ); | 
|         |     96 	} | 
|         |     97  | 
|         |     98 // --------------------------------------------------------- | 
|         |     99 // CLocalAppHandler::HandleUrlEmbeddedL() | 
|         |    100 // --------------------------------------------------------- | 
|         |    101 // | 
|         |    102 void CLocalAppHandler::HandleUrlEmbeddedL() | 
|         |    103 	{ | 
|         |    104 	CLOG_ENTERFN( "CLocalAppHandler::HandleUrlEmbeddedL()" ); | 
|         |    105     iEmbedded = ETrue; | 
|         |    106     HandleUrlL(); | 
|         |    107     NotifyClient(); | 
|         |    108 	CLOG_LEAVEFN( "CLocalAppHandler::HandleUrlEmbeddedL()" ); | 
|         |    109 	} | 
|         |    110  | 
|         |    111 // --------------------------------------------------------- | 
|         |    112 // CLocalAppHandler::HandleUrlStandaloneL() | 
|         |    113 // --------------------------------------------------------- | 
|         |    114 // | 
|         |    115 void CLocalAppHandler::HandleUrlStandaloneL() | 
|         |    116 	{ | 
|         |    117 	CLOG_ENTERFN( "CLocalAppHandler::HandleUrlStandaloneL()" ); | 
|         |    118     iEmbedded = EFalse; | 
|         |    119     HandleUrlL();     | 
|         |    120 	CLOG_LEAVEFN( "CLocalAppHandler::HandleUrlStandaloneL()" ); | 
|         |    121 	} | 
|         |    122  | 
|         |    123 // --------------------------------------------------------- | 
|         |    124 // CLocalAppHandler::HandleUrlL() | 
|         |    125 // --------------------------------------------------------- | 
|         |    126 // | 
|         |    127 void CLocalAppHandler::HandleUrlL() | 
|         |    128     { | 
|         |    129     TInt start = 0; | 
|         |    130     TInt length= 0; | 
|         |    131     // Find "localapp://" from the beginning | 
|         |    132     if ( 0 == iParsedUrl->FindF( KLocalAppSlash )) | 
|         |    133         { | 
|         |    134         length = KLocalAppSlash.iTypeLength; | 
|         |    135         } | 
|         |    136     // Else find  "localapp:" from the beginning | 
|         |    137     else if ( 0 == iParsedUrl->FindF( KLocalApp ) ) | 
|         |    138         { | 
|         |    139         length = KLocalApp.iTypeLength; | 
|         |    140         } | 
|         |    141     else | 
|         |    142         { | 
|         |    143         return; // not recognized URI. | 
|         |    144         } | 
|         |    145  | 
|         |    146     TPtrC startPtrC = iParsedUrl->Mid( length ); | 
|         |    147  | 
|         |    148     // Remove space from the beginning | 
|         |    149     while ( start < startPtrC.Length()  && ' ' ==  startPtrC[start] ) | 
|         |    150         { | 
|         |    151         ++start; | 
|         |    152         } | 
|         |    153     TPtrC headerPtrC = startPtrC.Mid( start ); | 
|         |    154      | 
|         |    155     if ( 0 == headerPtrC.FindF( KContactsId ) ) | 
|         |    156         { | 
|         |    157         HandleContactsL(); | 
|         |    158         } | 
|         |    159     else if ( 0 == headerPtrC.FindF( KCalendarId ) ) | 
|         |    160         { | 
|         |    161         HandleCalendarL(); | 
|         |    162         } | 
|         |    163     else if ( 0 == headerPtrC.FindF( KMessagingId ) ) | 
|         |    164         { | 
|         |    165         HandleMessagingL(); | 
|         |    166         } | 
|         |    167     else if ( 0 == headerPtrC.FindF( KMmsId ) ) | 
|         |    168         { | 
|         |    169         HandleMmsL(); | 
|         |    170         } | 
|         |    171     else if ( 0 == headerPtrC.FindF( KSmsId ) ) | 
|         |    172         { | 
|         |    173         HandleSmsL(); | 
|         |    174         } | 
|         |    175     else if ( 0 == headerPtrC.FindF( KJamId ) ) | 
|         |    176         { | 
|         |    177         HandleJamL(); | 
|         |    178         } | 
|         |    179     else | 
|         |    180         { | 
|         |    181         return; // do nothing, header was unknown | 
|         |    182         } | 
|         |    183     } | 
|         |    184 // --------------------------------------------------------- | 
|         |    185 // CLocalAppHandler::HandleJamL() | 
|         |    186 // --------------------------------------------------------- | 
|         |    187 // | 
|         |    188 void CLocalAppHandler::HandleJamL() | 
|         |    189     { | 
|         |    190     // Change "localapp:..." to "javaapp:..."     | 
|         |    191     HBufC *modifiedUrl = iParsedUrl->AllocL(); | 
|         |    192     CleanupStack::PushL( modifiedUrl ); | 
|         |    193     TPtr ptrModifiedUrl = modifiedUrl->Des(); | 
|         |    194     ptrModifiedUrl.Replace( 0, KLocalApp.iTypeLength, KJavaApp ); | 
|         |    195      | 
|         |    196     CSchemeHandler *schemeHandler = CSchemeHandler::NewL( ptrModifiedUrl ); | 
|         |    197     CleanupStack::PushL( schemeHandler ); | 
|         |    198      | 
|         |    199     if (iEmbedded) | 
|         |    200         { | 
|         |    201         schemeHandler->HandleUrlEmbeddedL(); | 
|         |    202         } | 
|         |    203     else | 
|         |    204         { | 
|         |    205         schemeHandler->HandleUrlStandaloneL();    | 
|         |    206         } | 
|         |    207     CleanupStack::PopAndDestroy( schemeHandler ); | 
|         |    208     CleanupStack::PopAndDestroy( modifiedUrl ); | 
|         |    209     } | 
|         |    210 // --------------------------------------------------------- | 
|         |    211 // CLocalAppHandler::HandleMmsL() | 
|         |    212 // --------------------------------------------------------- | 
|         |    213 // | 
|         |    214 void CLocalAppHandler::HandleMmsL() | 
|         |    215     { | 
|         |    216     TInt compose = iParsedUrl->FindF( KCompose ); | 
|         |    217     TInt show = iParsedUrl->FindF( KShow ); | 
|         |    218     if ( show == KErrNotFound && compose == KErrNotFound ) | 
|         |    219         { | 
|         |    220         return; | 
|         |    221         } | 
|         |    222     else if ( ( show != KErrNotFound && compose == KErrNotFound )  | 
|         |    223             || show != KErrNotFound && show < compose  ) | 
|         |    224         { | 
|         |    225         TInt inbox = iParsedUrl->FindF( KInbox ); | 
|         |    226         TInt composer = iParsedUrl->FindF( KComposer ); | 
|         |    227         if ( ( inbox != KErrNotFound && compose == KErrNotFound ) ||  | 
|         |    228              ( inbox != KErrNotFound && inbox < composer ) ) | 
|         |    229             { | 
|         |    230             TUid viewUid( KMceInboxViewId ); | 
|         |    231             TVwsViewId tvwsViewId(KUidMessaging, viewUid); | 
|         |    232             TBuf8<1> customMessage; | 
|         |    233             CEikonEnv::Static()->EikAppUi()->ActivateViewL( tvwsViewId, KMessageId, customMessage ); | 
|         |    234             } | 
|         |    235         else | 
|         |    236             { | 
|         |    237             CMmsToHandler* mmsto = CMmsToHandler::NewL( KMmsto ); | 
|         |    238             CleanupStack::PushL( mmsto ); | 
|         |    239             if (iEmbedded) | 
|         |    240                 { | 
|         |    241                 mmsto->HandleUrlEmbeddedL(); | 
|         |    242                 } | 
|         |    243             else | 
|         |    244                 { | 
|         |    245                 mmsto->HandleUrlStandaloneL();    | 
|         |    246                 } | 
|         |    247             CleanupStack::PopAndDestroy( mmsto ); | 
|         |    248             } | 
|         |    249         } | 
|         |    250     else  | 
|         |    251         { | 
|         |    252         TPtrC url = iParsedUrl->Mid( compose + KCompose.iTypeLength );  | 
|         |    253         CMmsToHandler* mmsto = CMmsToHandler::NewL( url ); | 
|         |    254         CleanupStack::PushL( mmsto ); | 
|         |    255         if (iEmbedded) | 
|         |    256             { | 
|         |    257             mmsto->HandleUrlEmbeddedL(); | 
|         |    258             } | 
|         |    259         else | 
|         |    260             { | 
|         |    261             mmsto->HandleUrlStandaloneL();    | 
|         |    262             } | 
|         |    263         CleanupStack::PopAndDestroy( mmsto ); | 
|         |    264         } | 
|         |    265     } | 
|         |    266 // --------------------------------------------------------- | 
|         |    267 // CLocalAppHandler::HandleSmsL() | 
|         |    268 // --------------------------------------------------------- | 
|         |    269 // | 
|         |    270 void CLocalAppHandler::HandleSmsL() | 
|         |    271     { | 
|         |    272     TInt compose = iParsedUrl->FindF( KCompose ); | 
|         |    273     TInt show = iParsedUrl->FindF( KShow ); | 
|         |    274     if ( show == KErrNotFound && compose == KErrNotFound ) | 
|         |    275         { | 
|         |    276         return; | 
|         |    277         } | 
|         |    278     else if ( ( show != KErrNotFound && compose == KErrNotFound )  | 
|         |    279             || show != KErrNotFound && show < compose  ) | 
|         |    280         { | 
|         |    281         TInt inbox = iParsedUrl->FindF( KInbox ); | 
|         |    282         TInt composer = iParsedUrl->FindF( KComposer ); | 
|         |    283         if ( ( inbox != KErrNotFound && compose == KErrNotFound ) ||  | 
|         |    284              ( inbox != KErrNotFound && inbox < composer ) ) | 
|         |    285             { | 
|         |    286             TUid viewUid( KMceInboxViewId ); | 
|         |    287             TVwsViewId tvwsViewId( KUidMessaging, viewUid ); | 
|         |    288             TBuf8<1> customMessage; | 
|         |    289             CEikonEnv::Static()->EikAppUi()->ActivateViewL( tvwsViewId, KMessageId, customMessage ); | 
|         |    290             } | 
|         |    291         else | 
|         |    292             { | 
|         |    293             CSmsHandler* sms = CSmsHandler::NewL( KSms ); | 
|         |    294             CleanupStack::PushL( sms ); | 
|         |    295             if ( iEmbedded ) | 
|         |    296                 { | 
|         |    297                 sms->HandleUrlEmbeddedL(); | 
|         |    298                 } | 
|         |    299             else | 
|         |    300                 { | 
|         |    301                 sms->HandleUrlStandaloneL();    | 
|         |    302                 } | 
|         |    303             CleanupStack::PopAndDestroy( sms ); | 
|         |    304             } | 
|         |    305         } | 
|         |    306     else  | 
|         |    307         { | 
|         |    308         TPtrC url = iParsedUrl->Mid( compose + KCompose.iTypeLength );  | 
|         |    309         CSmsHandler* sms = CSmsHandler::NewL( url ); | 
|         |    310         CleanupStack::PushL( sms ); | 
|         |    311         if ( iEmbedded ) | 
|         |    312             {  | 
|         |    313             sms->HandleUrlEmbeddedL(); | 
|         |    314             } | 
|         |    315         else | 
|         |    316             { | 
|         |    317             sms->HandleUrlStandaloneL();    | 
|         |    318             } | 
|         |    319         CleanupStack::PopAndDestroy( sms ); | 
|         |    320         } | 
|         |    321     } | 
|         |    322 // --------------------------------------------------------- | 
|         |    323 // CLocalAppHandler::HandleCalendarL() | 
|         |    324 // --------------------------------------------------------- | 
|         |    325 // | 
|         |    326 void CLocalAppHandler::HandleCalendarL() | 
|         |    327     { | 
|         |    328     iAppUid = KUidCalendar; | 
|         |    329     if ( KErrNotFound != iParsedUrl->FindF( KToday ) ) | 
|         |    330         { | 
|         |    331         iToday = ETrue; | 
|         |    332         } | 
|         |    333     StartAppL(); | 
|         |    334     } | 
|         |    335 // --------------------------------------------------------- | 
|         |    336 // CLocalAppHandler::HandleContactsL() | 
|         |    337 // --------------------------------------------------------- | 
|         |    338 // | 
|         |    339 void CLocalAppHandler::HandleContactsL() | 
|         |    340     { | 
|         |    341     iAppUid = KUidContacts ; | 
|         |    342     StartAppL(); | 
|         |    343     } | 
|         |    344 // --------------------------------------------------------- | 
|         |    345 // CLocalAppHandler::HandleMessagingL() | 
|         |    346 // --------------------------------------------------------- | 
|         |    347 // | 
|         |    348 void CLocalAppHandler::HandleMessagingL() | 
|         |    349     { | 
|         |    350     iAppUid = KUidMessaging; | 
|         |    351     StartAppL(); | 
|         |    352     } | 
|         |    353  | 
|         |    354 // --------------------------------------------------------- | 
|         |    355 // CLocalAppHandler::StartAppL() | 
|         |    356 // --------------------------------------------------------- | 
|         |    357 // | 
|         |    358 void CLocalAppHandler::StartAppL() | 
|         |    359     { | 
|         |    360     RWsSession wsServer; | 
|         |    361     User::LeaveIfError( wsServer.Connect() ); | 
|         |    362     CleanupClosePushL( wsServer ); | 
|         |    363     TApaTaskList taskList( wsServer ); | 
|         |    364     TApaTask task(taskList.FindApp( iAppUid )); | 
|         |    365  | 
|         |    366     if ( task.Exists() ) | 
|         |    367         { | 
|         |    368         task.BringToForeground();    | 
|         |    369         } | 
|         |    370     else | 
|         |    371         { | 
|         |    372         TApaAppInfo appInfo; | 
|         |    373         TApaAppCapabilityBuf capabilityBuf; | 
|         |    374         RApaLsSession lsSession; | 
|         |    375         User::LeaveIfError( lsSession.Connect() ); | 
|         |    376         CleanupClosePushL( lsSession ); | 
|         |    377         User::LeaveIfError(lsSession.GetAppInfo(appInfo, iAppUid )); | 
|         |    378         User::LeaveIfError(lsSession.GetAppCapability(capabilityBuf, iAppUid )); | 
|         |    379         TApaAppCapability& caps = capabilityBuf(); | 
|         |    380  | 
|         |    381         TFileName appName = appInfo.iFullName; | 
|         |    382         CApaCommandLine* cmdLine = CApaCommandLine::NewLC(); | 
|         |    383         #if (defined(SYMBIAN_SUPPORT_UI_FRAMEWORKS_V1) || defined(__SERIES60_27__) || defined(__SERIES60_28__))  | 
|         |    384         cmdLine->SetLibraryNameL(appName); | 
|         |    385         #else | 
|         |    386         cmdLine->SetExecutableNameL(appName); | 
|         |    387         #endif | 
|         |    388          | 
|         |    389         // If Calendar's Day view selected | 
|         |    390         if ( iAppUid == KUidCalendar && iToday ) | 
|         |    391             { | 
|         |    392             TBuf8<12> todayBuf; | 
|         |    393             todayBuf.Copy( (TUint8*)KDesToday().Ptr(), ( KDesToday.iTypeLength * 2 ) ); | 
|         |    394             cmdLine->SetTailEndL( todayBuf ); | 
|         |    395             } | 
|         |    396  | 
|         |    397         if (caps.iLaunchInBackground) | 
|         |    398             { | 
|         |    399             cmdLine->SetCommandL(EApaCommandBackground); | 
|         |    400             } | 
|         |    401         else | 
|         |    402             { | 
|         |    403             cmdLine->SetCommandL(EApaCommandRun); | 
|         |    404             } | 
|         |    405  | 
|         |    406         User::LeaveIfError(lsSession.StartApp(*cmdLine)); | 
|         |    407          | 
|         |    408         CleanupStack::PopAndDestroy(cmdLine); | 
|         |    409         CleanupStack::PopAndDestroy(); // lsSession    | 
|         |    410         } // else | 
|         |    411  | 
|         |    412     CleanupStack::PopAndDestroy(); // wsServer    | 
|         |    413     } | 
|         |    414  | 
|         |    415 // End of file | 
|         |    416  |