messagingappbase/ncnlist/src/CNcnMsvSessionHandler.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:   Methods for CNcnMsvSessionHandler class.
       
    15 *
       
    16 */
       
    17 
       
    18 
       
    19 
       
    20 // INCLUDE FILES
       
    21 #include    "NcnDebug.h"
       
    22 #include    "CNcnMsvSessionHandler.h"
       
    23 #include    "MNcnMsvSessionHandlerObserver.h"
       
    24 #include    <msvapi.h>                          // For CMsvSession
       
    25 
       
    26 // ================= LOCAL CONSTANTS =======================
       
    27 namespace
       
    28     {
       
    29     }
       
    30 
       
    31 // ================= MEMBER FUNCTIONS =======================
       
    32 
       
    33 // ----------------------------------------------------
       
    34 //  CNcnMsvSessionHandler::CNcnMsvSessionHandler
       
    35 // ----------------------------------------------------
       
    36 //
       
    37 CNcnMsvSessionHandler::CNcnMsvSessionHandler( ) :
       
    38     iObservers( 2 )
       
    39     {
       
    40     // empty
       
    41     }
       
    42 
       
    43 // ----------------------------------------------------
       
    44 //  CNcnMsvSessionHandler::ConstructL
       
    45 // ----------------------------------------------------
       
    46 //
       
    47 void CNcnMsvSessionHandler::ConstructL()
       
    48     {
       
    49     // empty
       
    50     }
       
    51     
       
    52 // ----------------------------------------------------
       
    53 //  CNcnMsvSessionHandler::NewL
       
    54 // ----------------------------------------------------
       
    55 //
       
    56 CNcnMsvSessionHandler* CNcnMsvSessionHandler::NewL( )
       
    57     {
       
    58     CNcnMsvSessionHandler* self = new (ELeave) CNcnMsvSessionHandler();
       
    59     
       
    60     CleanupStack::PushL( self );
       
    61     self->ConstructL();
       
    62     CleanupStack::Pop( self );
       
    63     
       
    64     return self;
       
    65     }
       
    66 
       
    67 // ----------------------------------------------------
       
    68 //  CNcnMsvSessionHandler::~CNcnMsvSessionHandler
       
    69 // ----------------------------------------------------
       
    70 //
       
    71 CNcnMsvSessionHandler::~CNcnMsvSessionHandler()
       
    72     {
       
    73     // stop sessino handler
       
    74     StopSessionHandler();
       
    75     }
       
    76 
       
    77 // ----------------------------------------------------
       
    78 //  CNcnMsvSessionHandler::HandleSessionEventL
       
    79 // ----------------------------------------------------
       
    80 //
       
    81 void CNcnMsvSessionHandler::HandleSessionEventL(
       
    82             TMsvSessionEvent aEvent,
       
    83             TAny* aArg1,
       
    84             TAny* /*aArg2*/,
       
    85             TAny* /*aArg3*/ )
       
    86     {
       
    87     // determine event type
       
    88     switch ( aEvent )
       
    89         {
       
    90 
       
    91         case EMsvMediaUnavailable:
       
    92             {
       
    93             // If the Unavailable Memory is External Memory then set it back to Phone Memory .
       
    94             NCN_RDEBUG( _L( "CNcnMsvSessionHandler::HandleSessionEventL - EMsvMediaUnavailable." ));
       
    95            	HandleMsvMediaUnAvailableL();
       
    96             break;
       
    97             }
       
    98 
       
    99     	case EMsvServerReady:
       
   100             {
       
   101             // Ignored. Session was initialized already in StartSessionHandlerL .
       
   102             // If message store medium changes, then "old" messages are deleted from the CMsvEntry index
       
   103             // and the index is kept valid without re-creating it.
       
   104             NCN_RDEBUG( _L( "CNcnMsvSessionHandler::HandleSessionEventL - EMsvSessionReady, ignored" ));
       
   105             NotifyMsvSessionReady();
       
   106             break;
       
   107             }
       
   108         // Msv server terminated
       
   109         case EMsvServerTerminated:
       
   110             {            
       
   111             HandleMsvTerminatedL();
       
   112             break;
       
   113             }
       
   114         // Msv session close event
       
   115         case EMsvCloseSession:
       
   116             {
       
   117             HandleMsvClosed();
       
   118             break;
       
   119             }
       
   120         // Entries created
       
   121         case EMsvEntriesCreated:
       
   122             {
       
   123             CMsvEntrySelection* selection =
       
   124                 static_cast<CMsvEntrySelection*>( aArg1 );
       
   125                 
       
   126             HandleMsvEntriesCreatedL( *selection );
       
   127             break;
       
   128             }
       
   129         // Entries deleted
       
   130         case EMsvEntriesDeleted:
       
   131             {
       
   132             CMsvEntrySelection* selection =
       
   133                 static_cast<CMsvEntrySelection*>( aArg1 );
       
   134                 
       
   135             HandleMsvEntriesDeletedL( *selection );
       
   136             break;
       
   137             }
       
   138         // Messages are moved to MMC
       
   139         case EMsvMediaChanged:
       
   140             {
       
   141             TDriveNumber* newDriveNumber = static_cast<TDriveNumber*>( aArg1 );
       
   142             HandleMsvMediaChangedL( *newDriveNumber );
       
   143             break;
       
   144             }
       
   145  		// Message server is again available    
       
   146         case EMsvMediaAvailable:
       
   147         	{
       
   148         	TDriveNumber* driveNumber = static_cast<TDriveNumber*>( aArg1 );
       
   149             HandleMsvMediaAvailableL( *driveNumber );
       
   150             break;            		
       
   151         	}
       
   152         // other events, ignore
       
   153         default:
       
   154             {
       
   155            	NCN_RDEBUG_INT( _L( "CNcnMsvSessionHandler::HandleSessionEventL - unknown event %d!" ), aEvent );
       
   156             break;
       
   157             }
       
   158         }
       
   159     }
       
   160     
       
   161 // ----------------------------------------------------
       
   162 //  CNcnMsvSessionHandler::AddObserver
       
   163 // ----------------------------------------------------
       
   164 //
       
   165 void CNcnMsvSessionHandler::AddObserverL(
       
   166     MNcnMsvSessionHandlerObserver* aObserver )
       
   167     {
       
   168     // append observer to array
       
   169     iObservers.AppendL( aObserver );    
       
   170     }
       
   171 
       
   172 // ----------------------------------------------------
       
   173 //  CNcnMsvSessionHandler::RemoveObserver
       
   174 // ----------------------------------------------------
       
   175 //
       
   176 void CNcnMsvSessionHandler::RemoveObserver(
       
   177     MNcnMsvSessionHandlerObserver* aObserver )
       
   178     {
       
   179     TInt count = iObservers.Count();
       
   180     TInt index = -1;
       
   181     
       
   182     // search for observer
       
   183     while( count-- )
       
   184         {
       
   185         MNcnMsvSessionHandlerObserver* observer =
       
   186             iObservers.At( count );
       
   187             
       
   188         // if pointer found    
       
   189         if( observer == aObserver )
       
   190             {
       
   191             index = count;
       
   192             break;
       
   193             }
       
   194         }
       
   195     
       
   196     // if observer was found delete it    
       
   197     if( index != -1 )
       
   198         {
       
   199         iObservers.Delete( index );
       
   200         iObservers.Compress();
       
   201         }
       
   202     }
       
   203 
       
   204 // ----------------------------------------------------
       
   205 //  CNcnMsvSessionHandler::IsMsvSessionReady
       
   206 // ----------------------------------------------------
       
   207 //
       
   208 TBool CNcnMsvSessionHandler::IsMsvSessionReady() const
       
   209     {
       
   210     return ( iMsvSession != 0 );
       
   211     }
       
   212 
       
   213 // ----------------------------------------------------
       
   214 //  CNcnMsvSessionHandler::MsvSessionL
       
   215 // ----------------------------------------------------
       
   216 //
       
   217 CMsvSession& CNcnMsvSessionHandler::MsvSessionL()
       
   218     {
       
   219     // leave if session is not ready
       
   220     if( !IsMsvSessionReady() )
       
   221         {
       
   222         User::Leave( KErrGeneral );
       
   223         }
       
   224         
       
   225     // return the session instance    
       
   226     return *iMsvSession;
       
   227     }
       
   228 
       
   229 // ----------------------------------------------------
       
   230 //  CNcnMsvSessionHandler::StartSessionHandlerL
       
   231 // ----------------------------------------------------
       
   232 //        
       
   233 void CNcnMsvSessionHandler::StartSessionHandlerL()
       
   234     {
       
   235     if( !iMsvSession )
       
   236         {
       
   237         // open msv session
       
   238         iMsvSession = CMsvSession::OpenSyncL( *this );
       
   239         
       
   240         // notity that msv session is ready
       
   241         NotifyMsvSessionReady();
       
   242         }
       
   243     }
       
   244         
       
   245 
       
   246 // ----------------------------------------------------
       
   247 //  CNcnMsvSessionHandler::StopSessionHandler
       
   248 // ----------------------------------------------------
       
   249 //    
       
   250 void CNcnMsvSessionHandler::StopSessionHandler()
       
   251     {
       
   252     // just delegate to close handler
       
   253     HandleMsvClosed();
       
   254     }
       
   255 
       
   256 // ----------------------------------------------------
       
   257 //  CNcnMsvSessionHandler::HandleMsvTerminatedL
       
   258 // ----------------------------------------------------
       
   259 //    
       
   260 void CNcnMsvSessionHandler::HandleMsvTerminatedL()
       
   261     {
       
   262     // handle msv close normally
       
   263     HandleMsvClosed();
       
   264     
       
   265     // re-start session handler
       
   266     StartSessionHandlerL();
       
   267     }
       
   268     
       
   269 // ----------------------------------------------------
       
   270 //  CNcnMsvSessionHandler::HandleMsvClosed
       
   271 // ----------------------------------------------------
       
   272 //
       
   273 void CNcnMsvSessionHandler::HandleMsvClosed()
       
   274     {
       
   275     // only handle close if session is ready
       
   276     if( iMsvSession )
       
   277         {
       
   278         // set temporary pointer
       
   279         CMsvSession* tmpMsvSession = iMsvSession;
       
   280         
       
   281         // clear instance variable since it's used
       
   282         // for tracking instance state
       
   283         iMsvSession = 0;        
       
   284         
       
   285         // notify observers that session was closed
       
   286         NotifyMsvSessionClosed();
       
   287         
       
   288         // finally delete the session
       
   289         delete tmpMsvSession;
       
   290         }    
       
   291     }
       
   292 
       
   293 // ----------------------------------------------------
       
   294 //  CNcnMsvSessionHandler::HandleEntriesCreatedL
       
   295 // ----------------------------------------------------
       
   296 //    
       
   297 void CNcnMsvSessionHandler::HandleMsvEntriesCreatedL(
       
   298     const CMsvEntrySelection& aSelection )
       
   299     {
       
   300     TInt count = aSelection.Count();
       
   301     
       
   302     while( count-- )
       
   303         {
       
   304         TMsvId id = aSelection.At( count );
       
   305         NotifyMsvEntryCreated( id );
       
   306         }
       
   307     }
       
   308     
       
   309 // ----------------------------------------------------
       
   310 //  CNcnMsvSessionHandler::HandleEntriesDeletedL
       
   311 // ----------------------------------------------------
       
   312 //    
       
   313 void CNcnMsvSessionHandler::HandleMsvEntriesDeletedL(
       
   314     const CMsvEntrySelection& aSelection )
       
   315     {
       
   316     TInt count = aSelection.Count();
       
   317     
       
   318     while( count-- )
       
   319         {
       
   320         TMsvId id = aSelection.At( count );
       
   321         NotifyMsvEntryDeleted( id );
       
   322         }
       
   323     }
       
   324 
       
   325 // ----------------------------------------------------
       
   326 //  CNcnMsvSessionHandler::NotifyMsvSessionReady
       
   327 // ----------------------------------------------------
       
   328 //    
       
   329 void CNcnMsvSessionHandler::NotifyMsvSessionReady()
       
   330     {
       
   331     TInt count = iObservers.Count();
       
   332     
       
   333     // process all observers
       
   334     while( count-- )
       
   335         {        
       
   336         MNcnMsvSessionHandlerObserver* observer =
       
   337             iObservers.At( count );
       
   338         
       
   339         TRAP_IGNORE( observer->HandleMsvSessionReadyL( *iMsvSession ) );
       
   340         }
       
   341     }
       
   342   
       
   343 // ----------------------------------------------------
       
   344 //  CNcnMsvSessionHandler::NotifyMsvSessionClosed
       
   345 // ----------------------------------------------------
       
   346 //        
       
   347 void CNcnMsvSessionHandler::NotifyMsvSessionClosed()
       
   348     {
       
   349     TInt count = iObservers.Count();
       
   350     
       
   351     // process all observers
       
   352     while( count-- )
       
   353         {        
       
   354         MNcnMsvSessionHandlerObserver* observer =
       
   355             iObservers.At( count );
       
   356         
       
   357         TRAP_IGNORE( observer->HandleMsvSessionClosedL() );
       
   358         }
       
   359     }
       
   360 
       
   361 // ----------------------------------------------------
       
   362 //  CNcnMsvSessionHandler::NotifyMsvEntryCreated
       
   363 // ----------------------------------------------------
       
   364 //    
       
   365 void CNcnMsvSessionHandler::NotifyMsvEntryCreated( const TMsvId& aMsvId )
       
   366     {
       
   367     TInt count = iObservers.Count();
       
   368     
       
   369     // process all observers
       
   370     while( count-- )
       
   371         {        
       
   372         MNcnMsvSessionHandlerObserver* observer =
       
   373             iObservers.At( count );
       
   374         
       
   375         TRAP_IGNORE( observer->HandleMsvEntryCreatedL( aMsvId ) );
       
   376         }
       
   377     }
       
   378   
       
   379 // ----------------------------------------------------
       
   380 //  CNcnMsvSessionHandler::NotifyMsvSessionClosed
       
   381 // ----------------------------------------------------
       
   382 //        
       
   383 void CNcnMsvSessionHandler::NotifyMsvEntryDeleted( const TMsvId& aMsvId )
       
   384     {
       
   385     TInt count = iObservers.Count();
       
   386     
       
   387     // process all observers
       
   388     while( count-- )
       
   389         {        
       
   390         MNcnMsvSessionHandlerObserver* observer =
       
   391             iObservers.At( count );
       
   392         
       
   393         TRAP_IGNORE( observer->HandleMsvEntryDeletedL( aMsvId ) );
       
   394         }
       
   395     }
       
   396     
       
   397 // ----------------------------------------------------
       
   398 //  CNcnMsvSessionHandler::HandleMsvMediaChangedL
       
   399 // ----------------------------------------------------
       
   400 //  
       
   401 void CNcnMsvSessionHandler::HandleMsvMediaChangedL( const TDriveNumber& aDriveNumber )
       
   402 	{
       
   403     TInt count = iObservers.Count();
       
   404     
       
   405     // process all observers
       
   406     while( count-- )
       
   407         {        
       
   408         MNcnMsvSessionHandlerObserver* observer =
       
   409             iObservers.At( count );
       
   410         
       
   411         TRAP_IGNORE( observer->HandleMsvMediaChangedL( aDriveNumber ) );
       
   412         }		
       
   413 	}
       
   414 	
       
   415 // ----------------------------------------------------
       
   416 //  CNcnMsvSessionHandler::HandleMsvMediaAvailableL
       
   417 // ----------------------------------------------------
       
   418 //  
       
   419 void CNcnMsvSessionHandler::HandleMsvMediaAvailableL( const TDriveNumber& aDriveNumber )
       
   420 	{
       
   421     TInt count = iObservers.Count();
       
   422     
       
   423     // process all observers
       
   424     while( count-- )
       
   425         {        
       
   426         MNcnMsvSessionHandlerObserver* observer =
       
   427             iObservers.At( count );
       
   428         
       
   429         TRAP_IGNORE( observer->HandleMsvMediaAvailableL( aDriveNumber ) );
       
   430         }		
       
   431 	}
       
   432 	
       
   433 // ----------------------------------------------------
       
   434 //  CNcnMsvSessionHandler::HandleMsvMediaUnAvailableL
       
   435 //  Call the corresponding observer to handle MediaUnAvailable event
       
   436 // ----------------------------------------------------
       
   437 //  
       
   438 void CNcnMsvSessionHandler::HandleMsvMediaUnAvailableL( )
       
   439 	{
       
   440     TInt count = iObservers.Count();
       
   441     
       
   442     // process all observers
       
   443     while( count != 0 )
       
   444         {     
       
   445         count--;   
       
   446         MNcnMsvSessionHandlerObserver* observer =
       
   447             iObservers.At( count );
       
   448         
       
   449         TRAP_IGNORE( observer->HandleMsvMediaUnavailableL() );
       
   450         }		
       
   451 	}
       
   452 //  End of File