meetingrequest/mrgui/src/resmrstatic.cpp
branchRCL_3
changeset 12 4ce476e64c59
parent 11 0396474f30f5
child 13 8592a65ad3fb
equal deleted inserted replaced
11:0396474f30f5 12:4ce476e64c59
     1 /*
       
     2 * Copyright (c) 2007-2009 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:  Static Tls data storage
       
    15 *
       
    16 */
       
    17 
       
    18 
       
    19 #include "emailtrace.h"
       
    20 #include "resmrstatic.h"
       
    21 
       
    22 #include "cesmrcontactmenuhandler.h"
       
    23 #include "cesmrcontactmanagerhandler.h"
       
    24 #include "cfsmailclient.h"
       
    25 #include "cfsmailbox.h"
       
    26 // <cmail> Removed profiling </cmail>
       
    27 
       
    28 /**
       
    29  * Storage stuct for RESMRStatic.
       
    30  */
       
    31 struct TESMRStaticData
       
    32     {
       
    33     TInt iInstanceCount;
       
    34     TInt iContactManagerHandlerCount;
       
    35     CESMRContactManagerHandler* iContactManagerHandler;
       
    36     TInt iContactMenuHandlerCount;
       
    37     CESMRContactMenuHandler* iContactMenuHandler;
       
    38     CFSMailClient* iFSMailClient;
       
    39     CFSMailBox* iFSMailBox;
       
    40 
       
    41     TInt iPbkxContactListingServiceCount;
       
    42     TInt iCurrentFieldIndex;
       
    43     TInt iFSMailBoxCount;
       
    44     };
       
    45 
       
    46 // ---------------------------------------------------------------------------
       
    47 // Cleanup operation for RPointerArray.
       
    48 // @param aArray Pointer to RPointerArray.
       
    49 // ---------------------------------------------------------------------------
       
    50 //
       
    51 void MailboxPointerArrayCleanup( TAny* aArray )
       
    52     {
       
    53     // just to avoid warnings when MR not supported
       
    54     RPointerArray<CFSMailBox>* entryArray =
       
    55         static_cast<RPointerArray<CFSMailBox>*>( aArray );
       
    56 
       
    57     entryArray->ResetAndDestroy();
       
    58     entryArray->Close();
       
    59     }
       
    60 
       
    61 // ======== MEMBER FUNCTIONS ========
       
    62 
       
    63 // ---------------------------------------------------------------------------
       
    64 // RESMRStatic::RESMRStatic
       
    65 // ---------------------------------------------------------------------------
       
    66 //
       
    67 EXPORT_C RESMRStatic::RESMRStatic( )
       
    68     {
       
    69     FUNC_LOG;
       
    70     //do nothing
       
    71     }
       
    72 
       
    73 // ---------------------------------------------------------------------------
       
    74 // RESMRStatic::~RESMRStatic
       
    75 // ---------------------------------------------------------------------------
       
    76 //
       
    77 EXPORT_C RESMRStatic::~RESMRStatic( )
       
    78     {
       
    79     FUNC_LOG;
       
    80     if ( iStaticData )
       
    81         {
       
    82         delete iStaticData->iContactMenuHandler;
       
    83         iStaticData->iContactMenuHandler = NULL;
       
    84 
       
    85         delete iStaticData->iContactManagerHandler;
       
    86         iStaticData->iContactManagerHandler = NULL;
       
    87         }
       
    88     }
       
    89 
       
    90 // ---------------------------------------------------------------------------
       
    91 // RESMRStatic::ConnectL
       
    92 // ---------------------------------------------------------------------------
       
    93 //
       
    94 EXPORT_C void RESMRStatic::ConnectL( )
       
    95     {
       
    96     FUNC_LOG;
       
    97     if (iStaticData )
       
    98         {
       
    99         // already connected
       
   100         return;
       
   101         }
       
   102 
       
   103     // Retrieve Tls pointer
       
   104     iStaticData = (TESMRStaticData*) Dll::Tls();
       
   105 
       
   106     // If Tls pointer was not set, create new static stuct
       
   107     // with NULL values
       
   108     if ( !iStaticData )
       
   109         {
       
   110         iStaticData = new (ELeave) TESMRStaticData();
       
   111         memset ( iStaticData, 0, sizeof( TESMRStaticData) );
       
   112         Dll::SetTls ( iStaticData );
       
   113         }
       
   114     ++iStaticData->iInstanceCount;
       
   115     }
       
   116 
       
   117 // ---------------------------------------------------------------------------
       
   118 // RESMRStatic::Close
       
   119 // ---------------------------------------------------------------------------
       
   120 //
       
   121 EXPORT_C void RESMRStatic::Close( )
       
   122     {
       
   123     FUNC_LOG;
       
   124     if (iStaticData )
       
   125         {
       
   126         if (iUsedTypes & EContactMenuHandler )
       
   127             {
       
   128             --iStaticData->iContactMenuHandlerCount;
       
   129             if (iStaticData->iContactMenuHandlerCount == 0 )
       
   130                 {
       
   131                 if ( iStaticData->iContactManagerHandlerCount == 0 )
       
   132                     {
       
   133                     // Delete both Handlers when both are ready to delete
       
   134                     // and Contact Manager Handler should be deleted last
       
   135                     // because the Menu Handler has dependency to it.
       
   136                     delete iStaticData->iContactMenuHandler;
       
   137                     iStaticData->iContactMenuHandler = NULL;
       
   138 
       
   139                     delete iStaticData->iContactManagerHandler;
       
   140                     iStaticData->iContactManagerHandler = NULL;
       
   141                     }
       
   142                 }
       
   143             }
       
   144 
       
   145         // If ContactManagerHandlerL was used
       
   146         if (iUsedTypes & EContactManagerHandler )
       
   147             {
       
   148             // Decrease counter
       
   149             --iStaticData->iContactManagerHandlerCount;
       
   150 
       
   151             // If this was last instance using pointer
       
   152             if ( iStaticData->iContactManagerHandlerCount == 0 )
       
   153                 {
       
   154                 if ( iStaticData->iContactMenuHandlerCount == 0 )
       
   155                     {
       
   156                     delete iStaticData->iContactMenuHandler;
       
   157                     iStaticData->iContactMenuHandler = NULL;
       
   158                     // Delete instance
       
   159                     delete iStaticData->iContactManagerHandler;
       
   160                     iStaticData->iContactManagerHandler = NULL;
       
   161                     }
       
   162                 }
       
   163             }
       
   164         
       
   165         // If FSMailClientL or FSMailBox was used
       
   166         if (iUsedTypes & EMailBoxHandler )
       
   167             {
       
   168             // Decrease counter
       
   169             --iStaticData->iFSMailBoxCount;
       
   170 
       
   171             // If this was last instance using pointer
       
   172             if (iStaticData->iFSMailBoxCount == 0 )
       
   173                 {
       
   174                 // Owned by CFSMailClient
       
   175                 delete iStaticData->iFSMailBox;
       
   176                 iStaticData->iFSMailBox = NULL;
       
   177 
       
   178                 // Delete instance
       
   179                 if ( iStaticData->iFSMailClient )
       
   180                     {
       
   181                     iStaticData->iFSMailClient->Close();
       
   182                     iStaticData->iFSMailClient = NULL;
       
   183                     }
       
   184                 }
       
   185             }
       
   186 
       
   187         // Decrease instance counter
       
   188         --iStaticData->iInstanceCount;
       
   189 
       
   190         // If this was last instance using pointer
       
   191         if (iStaticData->iInstanceCount == 0 )
       
   192             {
       
   193             delete iStaticData;
       
   194             Dll::FreeTls ( );
       
   195             }
       
   196         iStaticData = NULL;
       
   197         }
       
   198     }
       
   199 
       
   200 // ---------------------------------------------------------------------------
       
   201 // RESMRStatic::ContactManagerHandlerL
       
   202 // ---------------------------------------------------------------------------
       
   203 //
       
   204 EXPORT_C CESMRContactManagerHandler& RESMRStatic::ContactManagerHandlerL( )
       
   205     {
       
   206     FUNC_LOG;
       
   207     if ( !iStaticData->iContactManagerHandler )
       
   208         {
       
   209         iStaticData->iContactManagerHandler = 
       
   210 			CESMRContactManagerHandler::NewL();
       
   211         }
       
   212 
       
   213     if (!(iUsedTypes & EContactManagerHandler) )
       
   214         {
       
   215         ++iStaticData->iContactManagerHandlerCount;
       
   216         iUsedTypes |= EContactManagerHandler;
       
   217         }
       
   218     return *iStaticData->iContactManagerHandler;
       
   219     }
       
   220 
       
   221 // ---------------------------------------------------------------------------
       
   222 // RESMRStatic::ContactMenuHandlerL
       
   223 // ---------------------------------------------------------------------------
       
   224 //
       
   225 EXPORT_C CESMRContactMenuHandler& RESMRStatic::ContactMenuHandlerL( )
       
   226     {
       
   227     FUNC_LOG;
       
   228     if ( !iStaticData->iContactMenuHandler )
       
   229         {
       
   230         iStaticData->iContactMenuHandler =
       
   231             CESMRContactMenuHandler::NewL( ContactManagerHandlerL() );
       
   232         }
       
   233 
       
   234     if (!(iUsedTypes & EContactMenuHandler) )
       
   235         {
       
   236         ++iStaticData->iContactMenuHandlerCount;
       
   237         iUsedTypes |= EContactMenuHandler;
       
   238         }
       
   239 
       
   240     return *iStaticData->iContactMenuHandler;
       
   241     }
       
   242 
       
   243 // ---------------------------------------------------------------------------
       
   244 // RESMRStatic::CurrentFieldIndex
       
   245 // ---------------------------------------------------------------------------
       
   246 //
       
   247 EXPORT_C TInt RESMRStatic::CurrentFieldIndex()
       
   248     {
       
   249     FUNC_LOG;
       
   250     return iStaticData->iCurrentFieldIndex;
       
   251     }
       
   252 
       
   253 // ---------------------------------------------------------------------------
       
   254 // RESMRStatic::SetCurrentFieldIndex
       
   255 // ---------------------------------------------------------------------------
       
   256 //
       
   257 EXPORT_C void RESMRStatic::SetCurrentFieldIndex(TInt aFieldIndex)
       
   258     {
       
   259     FUNC_LOG;
       
   260     iStaticData->iCurrentFieldIndex = aFieldIndex;
       
   261     }
       
   262 
       
   263 // ---------------------------------------------------------------------------
       
   264 // RESMRStatic::MailBoxL
       
   265 // ---------------------------------------------------------------------------
       
   266 //
       
   267 EXPORT_C CFSMailBox& RESMRStatic::MailBoxL( const TDesC& aAddress )
       
   268     {
       
   269     FUNC_LOG;
       
   270     if ( !iStaticData->iFSMailBox )
       
   271         {
       
   272         CFSMailClient& fsMailClient = FSMailClientL();
       
   273 
       
   274         // Loop throug all mailboxes in this plug-in
       
   275         RPointerArray<CFSMailBox> mailboxes; // codescanner::resourcenotoncleanupstack
       
   276         CleanupStack::PushL(
       
   277                 TCleanupItem(
       
   278                         MailboxPointerArrayCleanup,
       
   279                         &mailboxes    ) );
       
   280 
       
   281         // With null uid we get all mailboxes
       
   282         TFSMailMsgId msgId;
       
   283         fsMailClient.ListMailBoxes(
       
   284                 msgId, mailboxes );
       
   285 
       
   286         TInt mailboxCount( mailboxes.Count() );
       
   287         for ( TInt j(0);
       
   288               j < mailboxCount && !iStaticData->iFSMailBox;
       
   289               ++j )
       
   290             {
       
   291             TPtrC mailboxOwnerAddName(
       
   292                     mailboxes[j]->OwnMailAddress().GetEmailAddress() );
       
   293             if ( mailboxOwnerAddName.Compare( aAddress ) == 0 )
       
   294                 {
       
   295                 // Correct mailbox is found
       
   296                 iStaticData->iFSMailBox = mailboxes[j];
       
   297                 mailboxes.Remove(j);
       
   298                 }
       
   299             }
       
   300         CleanupStack::PopAndDestroy(); // mailboxes
       
   301 
       
   302         if ( !iStaticData->iFSMailBox )
       
   303             {
       
   304             User::Leave( KErrAbort );
       
   305             }
       
   306         }
       
   307 
       
   308     iUsedTypes |= EMailBoxHandler;
       
   309     ++iStaticData->iFSMailBoxCount;
       
   310     return *iStaticData->iFSMailBox;
       
   311     }
       
   312 
       
   313 // ---------------------------------------------------------------------------
       
   314 // RESMRStatic::FSMailClientL
       
   315 // ---------------------------------------------------------------------------
       
   316 //
       
   317 CFSMailClient& RESMRStatic::FSMailClientL( )
       
   318     {
       
   319     FUNC_LOG;
       
   320     if (!iStaticData->iFSMailClient)
       
   321         {
       
   322         iStaticData->iFSMailClient = CFSMailClient::NewL ( );
       
   323         }
       
   324 
       
   325     return *iStaticData->iFSMailClient;
       
   326     }
       
   327 
       
   328 // EOF
       
   329