emailservices/emailclientapi/src/emailclientapiimpl.cpp
branchRCL_3
changeset 63 d189ee25cf9d
parent 16 4ce476e64c59
child 64 3533d4323edc
equal deleted inserted replaced
61:dcf0eedfc1a3 63:d189ee25cf9d
     1 /*
     1 /*
     2 * Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). 
     2 * Copyright (c) 2010 Nokia Corporation and/or its subsidiary(-ies). 
     3 * All rights reserved.
     3 * All rights reserved.
     4 * This component and the accompanying materials are made available
     4 * This component and the accompanying materials are made available
     5 * under the terms of "Eclipse Public License v1.0"
     5 * under the terms of "Eclipse Public License v1.0"
     6 * which accompanies this distribution, and is available
     6 * which accompanies this distribution, and is available
     7 * at the URL "http://www.eclipse.org/legal/epl-v10.html".
     7 * at the URL "http://www.eclipse.org/legal/epl-v10.html".
    22 #include <vwsdefpartner.h>
    22 #include <vwsdefpartner.h>
    23 #else
    23 #else
    24 #include <viewcli.h>
    24 #include <viewcli.h>
    25 #include <vwsdef.h>
    25 #include <vwsdef.h>
    26 #endif // SYMBIAN_ENABLE_SPLIT_HEADERS
    26 #endif // SYMBIAN_ENABLE_SPLIT_HEADERS
    27 #include <coemain.h> // CCoeEnv
       
    28 #include <coeaui.h> // CCoeAppUi
       
    29 #include <centralrepository.h>
    27 #include <centralrepository.h>
    30 #include "emailclientapiimpl.h"
    28 #include "emailclientapiimpl.h"
    31 #include "emailapiutils.h"
    29 #include "emailapiutils.h"
    32 #include "emailmailbox.h"
    30 #include "emailmailbox.h"
    33 #include <memailaddress.h>
    31 #include <memailaddress.h>
    34 #include "cfsmailplugin.h"
    32 #include "CFSMailPlugin.h"
    35 #include "cfsclientapi.h"
    33 #include "CFSMailClient.h"
    36 #include "emailclientapiimpldefs.h"
    34 #include "emailclientapiimpldefs.h"
    37 #include "emailmailboxcache.h"
    35 #include "emailmailboxcache.h"
    38 #include "FreestyleEmailUiConstants.h"
       
    39 #include "emailclientapi.hrh"
    36 #include "emailclientapi.hrh"
    40 #include "freestyleemailcenrepkeys.h"
    37 
    41 #include "FreestyleEmailUiConstants.h"
       
    42 
       
    43 // ---------------------------------------------------------------------------
       
    44 // CEmailClientApi::MailboxL
       
    45 // ---------------------------------------------------------------------------
    38 // ---------------------------------------------------------------------------
    46 //
    39 //
       
    40 // ---------------------------------------------------------------------------
    47 MEmailMailbox* CEmailClientApi::MailboxL( const TMailboxId& aId )
    41 MEmailMailbox* CEmailClientApi::MailboxL( const TMailboxId& aId )
    48     {
    42     {
    49     UpdateMailboxInfoCacheL();
    43     UpdateMailboxInfoCacheL();
    50     CPluginData* pluginData = MailboxInfoCacheL().PluginDataL( aId );
    44     CPluginData* pluginData = MailboxInfoCacheL().PluginDataL( aId );
    51     MEmailMailbox* mailbox = NULL;
    45     MEmailMailbox* mailbox = NULL;
    53         {
    47         {
    54         mailbox = CEmailMailbox::NewL( *pluginData, aId );
    48         mailbox = CEmailMailbox::NewL( *pluginData, aId );
    55         }
    49         }
    56     return mailbox;
    50     return mailbox;
    57     }
    51     }
    58 
       
    59 
    52 
    60 // -----------------------------------------------------------------------------
    53 // -----------------------------------------------------------------------------
    61 // 
    54 // 
    62 // -----------------------------------------------------------------------------
    55 // -----------------------------------------------------------------------------
    63 MEmailMailbox* CEmailClientApi::MailboxL( const TPtrC& aAddress )
    56 MEmailMailbox* CEmailClientApi::MailboxL( const TPtrC& aAddress )
    82                 {
    75                 {
    83                 refMailbox->Release();
    76                 refMailbox->Release();
    84                 }
    77                 }
    85             }
    78             }
    86         }
    79         }
    87     CleanupStack::PopAndDestroy();
    80     CleanupStack::PopAndDestroy( &mailboxes );
    88     // find mailbox or leave KErrNotFound
    81     // find mailbox or leave KErrNotFound
    89     if ( !mailbox)
    82     if ( !mailbox )
    90         {
    83         {
    91         User::Leave( KErrNotFound );
    84         User::Leave( KErrNotFound );
    92         }
    85         }
    93     return mailbox;
    86     return mailbox;
    94     }
    87     }
   114 // -----------------------------------------------------------------------------
   107 // -----------------------------------------------------------------------------
   115 TInt CEmailClientApi::GetMailboxesL( RMailboxPtrArray& aMailboxes )
   108 TInt CEmailClientApi::GetMailboxesL( RMailboxPtrArray& aMailboxes )
   116     {
   109     {
   117     REmailMailboxIdArray mailboxIdArray;
   110     REmailMailboxIdArray mailboxIdArray;
   118     CleanupClosePushL( mailboxIdArray );
   111     CleanupClosePushL( mailboxIdArray );
   119     
   112 
   120     // note! GetMailboxIdsL loads plugin and keeps loaded if it contains at
   113     // GetMailboxIdsL loads plugin and keeps loaded if it contains at
   121     // least one mailbox
   114     // least one mailbox
   122     TInt count = GetMailboxIdsL( mailboxIdArray );
   115     TInt count = GetMailboxIdsL( mailboxIdArray );
   123     while ( count-- )
   116     while ( count-- )
   124         {
   117         {
   125         // mailbox creation increases plugin ref count by one
   118         // mailbox creation increases plugin ref count by one
   130         }
   123         }
   131     // Created mailboxes still hold plugin references so we can decrease 
   124     // Created mailboxes still hold plugin references so we can decrease 
   132     // ref count.
   125     // ref count.
   133     ReleaseAllPlugins(); 
   126     ReleaseAllPlugins(); 
   134     
   127     
   135     CleanupStack::PopAndDestroy(); // mailboxIdArray
   128     CleanupStack::PopAndDestroy( &mailboxIdArray );
   136     return aMailboxes.Count();
   129     return aMailboxes.Count();
   137     }
   130     }
   138 
   131 
   139 // -----------------------------------------------------------------------------
   132 // -----------------------------------------------------------------------------
   140 // implement this
   133 //
   141 // -----------------------------------------------------------------------------
   134 // -----------------------------------------------------------------------------
   142 void CEmailClientApi::LaunchEmailL( const TLaunchPolicy aPolicy )
   135 void CEmailClientApi::LaunchEmailL( const TLaunchPolicy /*aPolicy*/ )
   143     {
   136     {
   144     if ( aPolicy == EShowLastUnseenMailbox)
   137     User::Leave(KErrNotSupported);
   145         {
   138     }
   146         CRepository* emailRepository = CRepository::NewL( KFreestyleEmailCenRep );
       
   147         CleanupStack::PushL(emailRepository);
       
   148         TInt numberOfMailboxes(0);
       
   149         TInt inboxId(0);
       
   150         TInt pluginId(0);
       
   151         emailRepository->Get(KNumberOfMailboxesWithNewEmails,numberOfMailboxes);
       
   152         if(numberOfMailboxes > 0)
       
   153             {
       
   154             emailRepository->Get(KNumberOfMailboxesWithNewEmails+(numberOfMailboxes*2-1),pluginId);            
       
   155             emailRepository->Get(KNumberOfMailboxesWithNewEmails+(numberOfMailboxes*2),inboxId);
       
   156            
       
   157             TUid pluginUid = {pluginId};
       
   158             TMailListActivationData activationData;
       
   159     
       
   160             activationData.iMailBoxId.SetId(inboxId);
       
   161             activationData.iMailBoxId.SetPluginId(pluginUid);
       
   162             activationData.iFolderId.SetPluginId(pluginUid);
       
   163             TPckgBuf<TMailListActivationData> pkgBuf(activationData);
       
   164     
       
   165             CCoeEnv::Static()->AppUi()->CreateActivateViewEventL( 
       
   166                     TVwsViewId(KFSEmailUiUid, MailListId), KStartListWithFolderId, 
       
   167                     pkgBuf );
       
   168             }
       
   169         else
       
   170             {
       
   171             // We should never come here since the mailbox count should be more than 0 if launchemailL is called
       
   172             // but just to be safe launch the email in launchergrid if something went wrong with the repository
       
   173             const TUid dummy = {0};
       
   174             CCoeEnv::Static()->AppUi()->CreateActivateViewEventL(TVwsViewId(KFSEmailUiUid, AppGridId),
       
   175             dummy, KNullDesC8() );        
       
   176             }
       
   177         CleanupStack::PopAndDestroy();//emailRepository
       
   178         }
       
   179     else if ( aPolicy == EDefault )
       
   180         {
       
   181         const TUid dummy = {0};                    
       
   182         CCoeEnv::Static()->AppUi()->CreateActivateViewEventL(TVwsViewId(KFSEmailUiUid, AppGridId),
       
   183         dummy, KNullDesC8() );
       
   184         }
       
   185     }    
       
   186 
   139 
   187 // -----------------------------------------------------------------------------
   140 // -----------------------------------------------------------------------------
   188 // 
   141 // 
   189 // -----------------------------------------------------------------------------
   142 // -----------------------------------------------------------------------------
   190 CPluginData* CEmailClientApi::TPluginIterator::Next()
   143 CPluginData* CEmailClientApi::TPluginIterator::Next()
   201 // 
   154 // 
   202 // -----------------------------------------------------------------------------
   155 // -----------------------------------------------------------------------------
   203 CEmailClientApi* CEmailClientApi::NewL()
   156 CEmailClientApi* CEmailClientApi::NewL()
   204     {
   157     {
   205     CEmailClientApi* instance = static_cast<CEmailClientApi*>( Dll::Tls() );
   158     CEmailClientApi* instance = static_cast<CEmailClientApi*>( Dll::Tls() );
   206     
   159 
   207     if ( instance == NULL )
   160     if ( !instance )
   208         {
   161         {
   209         instance = new ( ELeave ) CEmailClientApi();
   162         instance = new ( ELeave ) CEmailClientApi();
   210         CleanupStack::PushL( instance );
   163         CleanupStack::PushL( instance );
   211         instance->ConstructL();
   164         instance->ConstructL();
   212         User::LeaveIfError( Dll::SetTls( instance ) );
   165         User::LeaveIfError( Dll::SetTls( instance ) );
   213         CleanupStack::Pop();
   166         CleanupStack::Pop( instance );
   214         }
   167         }
   215 
   168 
   216     instance->iInstanceCounter++;
   169     instance->iInstanceCounter++;
   217         
   170 
   218     return instance;
   171     return instance;
   219     }
   172     }
   220 
   173 
   221 // -----------------------------------------------------------------------------
   174 // -----------------------------------------------------------------------------
   222 // 
   175 // 
   233         delete iPluginDataArray[count];
   186         delete iPluginDataArray[count];
   234         }
   187         }
   235     iPluginDataArray.Close();
   188     iPluginDataArray.Close();
   236     iLoadedPluginsArray.Close();
   189     iLoadedPluginsArray.Close();
   237     delete iMailboxCache;
   190     delete iMailboxCache;
   238     delete iClientAPI;
   191 
   239     Dll::FreeTls();
   192     Dll::FreeTls();
   240     }
   193     }
   241 
   194 
   242 // -----------------------------------------------------------------------------
   195 // -----------------------------------------------------------------------------
   243 // 
   196 // 
   244 // -----------------------------------------------------------------------------
   197 // -----------------------------------------------------------------------------
   245 CEmailClientApi::CEmailClientApi() : iInstanceCounter( 0 )
   198 CEmailClientApi::CEmailClientApi() : iInstanceCounter( 0 )
   246     {        
   199     {
   247     }
   200     }
   248 
   201 
   249 // -----------------------------------------------------------------------------
   202 // -----------------------------------------------------------------------------
   250 // 
   203 // 
   251 // -----------------------------------------------------------------------------
   204 // -----------------------------------------------------------------------------
   287             // failed to append, give up
   240             // failed to append, give up
   288             delete pluginData;
   241             delete pluginData;
   289             count = 0;
   242             count = 0;
   290             }
   243             }
   291         }
   244         }
   292     iClientAPI = CFSClientAPI::NewL(this);
   245     iMailClient =  CFSMailClient::NewL();
   293     CleanupStack::PopAndDestroy(); // CleanupImplInfoPushL
   246     CleanupStack::PopAndDestroy( &implInfoArray );
   294     User::LeaveIfError( err );    
   247     User::LeaveIfError( err );    
   295     }
   248     }
   296 
   249 
   297 
       
   298 // -----------------------------------------------------------------------------
   250 // -----------------------------------------------------------------------------
   299 // 
   251 // 
   300 // -----------------------------------------------------------------------------
   252 // -----------------------------------------------------------------------------
   301 TEmailTypeId CEmailClientApi::InterfaceId() const
   253 TEmailTypeId CEmailClientApi::InterfaceId() const
   302     {
   254     {
   315     else
   267     else
   316         {
   268         {
   317         this->iInstanceCounter--;
   269         this->iInstanceCounter--;
   318         }
   270         }
   319     }
   271     }
   320        
   272 
   321 // -----------------------------------------------------------------------------
   273 // -----------------------------------------------------------------------------
   322 // Returns plugin instance from plugin data. If we already have "claimed"
   274 // Returns plugin instance from plugin data. If we already have "claimed"
   323 // instance once, prevent increment of reference count 
   275 // instance once, prevent increment of reference count 
   324 // -----------------------------------------------------------------------------
   276 // -----------------------------------------------------------------------------
   325 CFSMailPlugin* CEmailClientApi::UsePlugin( CPluginData& aPluginData )
   277 CFSMailPlugin* CEmailClientApi::UsePlugin( CPluginData& aPluginData )
   343         // already in use, obtain plugin pointer from the array
   295         // already in use, obtain plugin pointer from the array
   344         pluginDataPtr = &iLoadedPluginsArray[index];
   296         pluginDataPtr = &iLoadedPluginsArray[index];
   345         }
   297         }
   346     return pluginDataPtr->iPlugin;
   298     return pluginDataPtr->iPlugin;
   347     }
   299     }
   348     
   300 
   349 // -----------------------------------------------------------------------------
   301 // -----------------------------------------------------------------------------
   350 // 
   302 // 
   351 // -----------------------------------------------------------------------------
   303 // -----------------------------------------------------------------------------
   352 void CEmailClientApi::ReleasePlugin( CPluginData& aPluginData )
   304 void CEmailClientApi::ReleasePlugin( CPluginData& aPluginData )
   353     {
   305     {
   376 // -----------------------------------------------------------------------------
   328 // -----------------------------------------------------------------------------
   377 // 
   329 // 
   378 // -----------------------------------------------------------------------------
   330 // -----------------------------------------------------------------------------
   379 CEmailMailboxCache& CEmailClientApi::MailboxInfoCacheL()
   331 CEmailMailboxCache& CEmailClientApi::MailboxInfoCacheL()
   380     {
   332     {
   381     if ( !iMailboxCache) 
   333     if ( !iMailboxCache)
   382         {
   334         {
   383         iMailboxCache = CEmailMailboxCache::NewL();
   335         iMailboxCache = CEmailMailboxCache::NewL();
   384         }
   336         }
   385     return *iMailboxCache;
   337     return *iMailboxCache;
   386     }
   338     }
   426                 // don't continue if OOM
   378                 // don't continue if OOM
   427                 User::Leave( KErrNoMemory );
   379                 User::Leave( KErrNoMemory );
   428                 }
   380                 }
   429             pluginData = iter.Next();
   381             pluginData = iter.Next();
   430             }
   382             }
   431         mbcache.EndCachingPop();    
   383         mbcache.EndCachingPop();
   432         }    
   384         }
   433     }
   385     }
   434 
   386 
   435 // -----------------------------------------------------------------------------
   387 // -----------------------------------------------------------------------------
   436 // 
   388 // 
   437 // -----------------------------------------------------------------------------
   389 // -----------------------------------------------------------------------------
   443     aPlugin.ListMailBoxesL( pluginMailboxes );
   395     aPlugin.ListMailBoxesL( pluginMailboxes );
   444     TInt mailboxCount = pluginMailboxes.Count();
   396     TInt mailboxCount = pluginMailboxes.Count();
   445     while ( mailboxCount-- )
   397     while ( mailboxCount-- )
   446         {
   398         {
   447         const TFSMailMsgId& mailboxId = pluginMailboxes[mailboxCount];
   399         const TFSMailMsgId& mailboxId = pluginMailboxes[mailboxCount];
   448         TMailboxId id( mailboxId.Id() );                    
   400         TMailboxId id( mailboxId.Id() );
   449         MailboxInfoCacheL().AddMailboxL( aPluginData, id );
   401         MailboxInfoCacheL().AddMailboxL( aPluginData, id );
   450         containsMailbox = ETrue;
   402         containsMailbox = ETrue;
   451         }
   403         }
   452     CleanupStack::PopAndDestroy();  // pluginMailboxes
   404     CleanupStack::PopAndDestroy( &pluginMailboxes );
   453     return containsMailbox;
   405     return containsMailbox;
   454     }
   406     }
   455 
   407 
   456 // -----------------------------------------------------------------------------
   408 // -----------------------------------------------------------------------------
   457 // 
   409 // 
   458 // -----------------------------------------------------------------------------
   410 // -----------------------------------------------------------------------------
   459 TInt CEmailClientApi::IndexOfLoadedPluginData( const TPluginData& aPluginData ) const
   411 TInt CEmailClientApi::IndexOfLoadedPluginData( const TPluginData& aPluginData ) const
   460     {
   412     {
   461     TIdentityRelation<TPluginData> relation( CEmailClientApi::PluginDataEquals );    
   413     TIdentityRelation<TPluginData> relation( CEmailClientApi::PluginDataEquals );
   462     return iLoadedPluginsArray.Find( aPluginData, relation );
   414     return iLoadedPluginsArray.Find( aPluginData, relation );
   463     }
   415     }
   464 
   416 
   465 // -----------------------------------------------------------------------------
   417 // -----------------------------------------------------------------------------
   466 // 
   418 // 
   468 TBool CEmailClientApi::PluginDataEquals( const TPluginData& a1, const TPluginData& a2 )
   420 TBool CEmailClientApi::PluginDataEquals( const TPluginData& a1, const TPluginData& a2 )
   469     {
   421     {
   470     return ( a1.iUid == a2.iUid );
   422     return ( a1.iUid == a2.iUid );
   471     }
   423     }
   472 
   424 
   473 CFSMailPlugin* CEmailClientApi::GetPluginByUid(TUid aUid)
   425 // End of file
   474     {
       
   475     CPluginData *p = NULL;
       
   476     CFSMailPlugin* plugin = NULL;
       
   477 
       
   478     TRAP_IGNORE( p = iMailboxCache->PluginDataL(aUid) );
       
   479     if ( p )
       
   480         {
       
   481         plugin = p->ClaimInstance();       
       
   482         p->ReleaseInstance();
       
   483         }
       
   484     return plugin;
       
   485     }
       
   486 
       
   487 // End of file.