messagingappbase/schemeplugin/src/LocalAppHandler.cpp
changeset 0 72b543305e3a
equal deleted inserted replaced
-1:000000000000 0:72b543305e3a
       
     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