mmsharing/mmshavailability/src/musavadefaultimp.cpp
changeset 15 ccd8e69b5392
parent 2 b31261fd4e04
child 20 e8be2c2e049d
child 22 496ad160a278
equal deleted inserted replaced
2:b31261fd4e04 15:ccd8e69b5392
     1 /*
       
     2 * Copyright (c) 2005-2007 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:   This is default implementation class for CMusAvaInterface
       
    15 *
       
    16 */
       
    17 
       
    18 
       
    19 
       
    20 #include "musavadefaultimp.h"
       
    21 #include "musavaavailabilityobserver.h"
       
    22 #include "musavaobserver.h"
       
    23 #include "musavasettingsimp.h"
       
    24 #include "musavasharedobject.h"
       
    25 #include "muslogger.h"
       
    26 #include "musavainvitehandler.h"
       
    27 #include "musavanetworkavailability.h"
       
    28 #include "musavacontactavailability.h"
       
    29 #include "musavaconnectionavailability.h"
       
    30 #include "musavaregisteravailability.h"
       
    31 #include "musavaoptionhandler.h"
       
    32 #include "musavadefaultoptionhandler.h"
       
    33 #include "musavasipprofileavailability.h"
       
    34 #include "musavasettingavailability.h"
       
    35 
       
    36 #include "mussesseioninformationapi.h"
       
    37 
       
    38 #include <e32property.h>
       
    39 
       
    40 
       
    41 const MMusAvaObserver::TAvailabilityName KMinimumAvailability
       
    42     = MMusAvaObserver::EMusAvaBearerStatus;
       
    43 
       
    44 const MMusAvaObserver::TAvailabilityName KMandatoryAvailability
       
    45     = MMusAvaObserver::EMusAvaNameRegistration;
       
    46 
       
    47 const MMusAvaObserver::TAvailabilityName KExtensionAvailability
       
    48     = MMusAvaObserver::EMusAvaOptionHandler;
       
    49 
       
    50 
       
    51 // -----------------------------------------------------------------------------
       
    52 // Two-phased constructor.
       
    53 // -----------------------------------------------------------------------------
       
    54 //
       
    55 CMusAvaDefaultImp* CMusAvaDefaultImp::NewL()
       
    56     {
       
    57     MUS_LOG( "mus: [MUSAVA]  -> CMusAvaDefaultImp::NewL" )
       
    58     CMusAvaDefaultImp* self = new (ELeave) CMusAvaDefaultImp();
       
    59     CleanupStack::PushL (self);
       
    60     self->ConstructL();
       
    61     CleanupStack::Pop( self );
       
    62     MUS_LOG( "mus: [MUSAVA]  <- CMusAvaDefaultImp::NewL" )
       
    63     return self;
       
    64     }
       
    65 
       
    66 
       
    67 // -----------------------------------------------------------------------------
       
    68 // C++ destructor.
       
    69 // -----------------------------------------------------------------------------
       
    70 //
       
    71 CMusAvaDefaultImp::~CMusAvaDefaultImp()
       
    72     {
       
    73     MUS_LOG( "mus: [MUSAVA]  -> CMusAvaDefaultImp::~CMusAvaDefaultImp" )
       
    74     this->Stop();
       
    75     iAvailabilities.ResetAndDestroy();
       
    76     delete iSettings;
       
    77     iSettings = NULL;
       
    78     MUS_LOG( "mus: [MUSAVA]  <- CMusAvaDefaultImp::~CMusAvaDefaultImp" )
       
    79     }
       
    80 
       
    81 
       
    82 // -----------------------------------------------------------------------------
       
    83 // Symbian second-phase constructor.
       
    84 // -----------------------------------------------------------------------------
       
    85 //
       
    86 void CMusAvaDefaultImp::ConstructL()
       
    87     {
       
    88     MUS_LOG( "mus: [MUSAVA]  -> CMusAvaDefaultImp::ConstructL" )
       
    89     iSettings = CMusAvaSettingsImp::NewL();
       
    90     CreateAvailabilityModulesL();
       
    91     MUS_LOG( "mus: [MUSAVA]  <- CMusAvaDefaultImp::ConstructL" )
       
    92     }
       
    93 
       
    94 
       
    95 // -----------------------------------------------------------------------------
       
    96 // C++ Constructor
       
    97 // -----------------------------------------------------------------------------
       
    98 //
       
    99 CMusAvaDefaultImp::CMusAvaDefaultImp()
       
   100     :iObserver( NULL ),
       
   101     iCurrentAvailability( MMusAvaObserver::EMusAvaNameNotDefined ),
       
   102     iAvailabilityStatus ( MMusAvaObserver::EMusAvaStatusNotExecuted ),
       
   103     iStopping( EFalse ),
       
   104     iExecuteStarted( EFalse )
       
   105     {
       
   106     }
       
   107 
       
   108 
       
   109 // -----------------------------------------------------------------------------
       
   110 // Creates concrete factory and all availability objects
       
   111 // -----------------------------------------------------------------------------
       
   112 //
       
   113 void CMusAvaDefaultImp::CreateAvailabilityModulesL()
       
   114     {
       
   115     MUS_LOG( "mus: [MUSAVA]  -> CMusAvaDefaultImp::\
       
   116         CreateAvailabilityModulesL" )
       
   117     
       
   118     if ( iAvailabilities.Count() )
       
   119         {
       
   120         Stop();
       
   121         iAvailabilities.ResetAndDestroy();
       
   122         }
       
   123 
       
   124     /* We need handlers all the time to respond incoming Invite/Options 
       
   125        So construct this modules first.
       
   126     */
       
   127     ConstuctHandlerAvailabilityModulesL();
       
   128 
       
   129     /* We must check the static availability modules like sipprofile 
       
   130        mus activation settings. if this fails then this 
       
   131        will be fatal and no need to go and construct further.
       
   132     */
       
   133     ConstructStaticAvailabilityModulesL();
       
   134 
       
   135     /* Check the handler and static availability modules are OK . If it is not
       
   136      * OK then dont need to create further availability modules.
       
   137      */
       
   138     for ( TInt i = 0; i < iAvailabilities.Count(); i++ )
       
   139         {
       
   140         if ( !iAvailabilities[i]->Available())
       
   141             {
       
   142             MUS_LOG1( "mus: [MUSAVA]  <- CMusAvaDefaultImp:: \
       
   143                       CreateAvailabilityModulesL Fails! Module = %d ",i )
       
   144             return ;
       
   145             }
       
   146         }    
       
   147     
       
   148     /* This should construct modules in where availability could change 
       
   149      * dynamically such as network,bearer and call status etc.    
       
   150      */
       
   151     ConstructDynamicAvailabilityModulesL();
       
   152 
       
   153     MUS_LOG( "mus: [MUSAVA]  <- CMusAvaDefaultImp::\
       
   154         CreateAvailabilityModulesL" )
       
   155     }
       
   156 
       
   157 // -----------------------------------------------------------------------------
       
   158 // Creates concrete standard availability objects
       
   159 // -----------------------------------------------------------------------------
       
   160 //
       
   161 void CMusAvaDefaultImp::ConstuctHandlerAvailabilityModulesL()
       
   162     {
       
   163     MUS_LOG( "mus: [MUSAVA]  -> CMusAvaDefaultImp::\
       
   164                                         ConstuctHandlerAvailabilityModulesL" )
       
   165 
       
   166     CMusAvaInviteHandler* inviteHandler = CMusAvaInviteHandler::NewLC(
       
   167                                                            *this, *iSettings ) ;
       
   168     iAvailabilities.AppendL( inviteHandler );
       
   169     CleanupStack::Pop( inviteHandler );    
       
   170 
       
   171     CMusAvaDefaultOptionHandler* defaultOptionHandler =
       
   172                             CMusAvaDefaultOptionHandler::NewLC( *this, *iSettings );
       
   173 	iAvailabilities.AppendL( defaultOptionHandler );
       
   174     CleanupStack::Pop( defaultOptionHandler );
       
   175 
       
   176     MUS_LOG( "mus: [MUSAVA]  <- CMusAvaDefaultImp::\
       
   177         ConstuctHandlerAvailabilityModulesL" )
       
   178     }
       
   179 
       
   180 // -----------------------------------------------------------------------------
       
   181 // Creates concrete standard availability objects
       
   182 // -----------------------------------------------------------------------------
       
   183 //
       
   184 void CMusAvaDefaultImp::ConstructStaticAvailabilityModulesL()
       
   185     {
       
   186     MUS_LOG( "mus: [MUSAVA]  -> CMusAvaDefaultImp::\
       
   187                                             ConstructStaticAvailabilityModulesL" )
       
   188     
       
   189     /* Mus Activation Settings */
       
   190     CMusAvaSettingAvailability* settingAvailability =
       
   191                             CMusAvaSettingAvailability::NewLC( *this );
       
   192 	iAvailabilities.AppendL( settingAvailability );
       
   193     CleanupStack::Pop( settingAvailability );
       
   194 
       
   195     /* Existence of Sip profile */
       
   196     CMusAvaSipprofileAvailability* sipprofileExist =
       
   197                             CMusAvaSipprofileAvailability::NewLC( *this ) ;
       
   198     iAvailabilities.AppendL( sipprofileExist );
       
   199     CleanupStack::Pop( sipprofileExist );
       
   200     MUS_LOG( "mus: [MUSAVA]  <- CMusAvaDefaultImp:: \
       
   201                                             ConstructStaticAvailabilityModulesL" )
       
   202     }
       
   203 
       
   204 // -----------------------------------------------------------------------------
       
   205 // Creates concrete standard availability objects
       
   206 // -----------------------------------------------------------------------------
       
   207 //
       
   208 void CMusAvaDefaultImp::ConstructDynamicAvailabilityModulesL()
       
   209     {
       
   210     MUS_LOG( "mus: [MUSAVA]  -> CMusAvaDefaultImp::\
       
   211                                            ConstructDynamicAvailabilityModulesL" )       
       
   212     // Create network availability
       
   213     CMusAvaNetworkAvailability* networkAvailability =
       
   214                             CMusAvaNetworkAvailability::NewLC( *this, *iSettings ) ;
       
   215     iAvailabilities.AppendL( networkAvailability );
       
   216     CleanupStack::Pop( networkAvailability );
       
   217 
       
   218     // Contact availability
       
   219     CMusAvaContactAvailability* contactAvailability = 
       
   220                             CMusAvaContactAvailability::NewLC( *this, *iSettings );
       
   221     iAvailabilities.AppendL( contactAvailability );
       
   222     CleanupStack::Pop( contactAvailability );
       
   223 
       
   224     //Connection monitor
       
   225     CMusAvaConnectionAvailability* connectionAvailability =
       
   226                           CMusAvaConnectionAvailability::NewLC( *this, *iSettings );
       
   227     iAvailabilities.AppendL( connectionAvailability );
       
   228     CleanupStack::Pop( connectionAvailability );
       
   229 
       
   230     // Create register availability
       
   231     CMusAvaRegisterAvailability* registerAvailability = 
       
   232                             CMusAvaRegisterAvailability::NewLC( *this, *iSettings );
       
   233     iAvailabilities.AppendL( registerAvailability );
       
   234     CleanupStack::Pop( registerAvailability );
       
   235 
       
   236     // Extension availabilities ->
       
   237 
       
   238     // Create SIP options availability
       
   239     CMusAvaOptionHandler* optionHandler = 
       
   240                                   CMusAvaOptionHandler::NewLC( *this, *iSettings );
       
   241     iAvailabilities.AppendL( optionHandler );
       
   242     CleanupStack::Pop( optionHandler );
       
   243 
       
   244     MUS_LOG( "mus: [MUSAVA]  <- CMusAvaDefaultImp::ConstructDynamicAvailabilityModulesL" )
       
   245     }
       
   246 
       
   247 // -----------------------------------------------------------------------------
       
   248 // Create work for executing availability report.
       
   249 // -----------------------------------------------------------------------------
       
   250 //
       
   251 void CMusAvaDefaultImp::ExecuteAvailablitityModules()
       
   252     {
       
   253     MUS_LOG( "mus: [MUSAVA]  -> CMusAvaDefaultImp::\
       
   254         ExecuteAvailablitityModules" )
       
   255     iExecuteStarted = ETrue;
       
   256     TBool goOn = ETrue;
       
   257     for ( TInt i = 0; i < iAvailabilities.Count() && goOn; i++ )
       
   258         {
       
   259         if ( !iAvailabilities[i]->Available() &&  
       
   260             !iAvailabilities[i]->Executing())
       
   261             {
       
   262             iAvailabilities[i]->Execute();
       
   263             if ( iAvailabilities[i]->State() < MMusAvaObserver::EMusAvaStatusInProgress )
       
   264                 {
       
   265                 goOn = EFalse;
       
   266                 }
       
   267             }
       
   268         }
       
   269     iExecuteStarted = EFalse;
       
   270     MUS_LOG( "mus: [MUSAVA]  <- CMusAvaDefaultImp::\
       
   271         ExecuteAvailablitityModules" )
       
   272     }
       
   273 
       
   274 
       
   275 // -----------------------------------------------------------------------------
       
   276 // Retuns setting interface for the client.
       
   277 // -----------------------------------------------------------------------------
       
   278 //
       
   279 MMusAvaSettings& CMusAvaDefaultImp::Settings()
       
   280     {
       
   281     return *iSettings;
       
   282     }
       
   283 
       
   284 
       
   285 // -----------------------------------------------------------------------------
       
   286 // Set Observer interface for the client.
       
   287 // -----------------------------------------------------------------------------
       
   288 //
       
   289 void CMusAvaDefaultImp::SetObserver( MMusAvaObserver& aObserver )
       
   290     {
       
   291     iObserver = &aObserver;
       
   292     }
       
   293 
       
   294 // -----------------------------------------------------------------------------
       
   295 // Set MMusAvaSettingsObserver interface for the client.
       
   296 // -----------------------------------------------------------------------------
       
   297 //
       
   298 void CMusAvaDefaultImp::SetSettingsObserver( MMusAvaSettingsObserver& aObserver )
       
   299     {
       
   300     iSettings->SetObserver( aObserver );
       
   301     }
       
   302 // -----------------------------------------------------------------------------
       
   303 // Requests the implementation to start to investigate availabilites.
       
   304 // -----------------------------------------------------------------------------
       
   305 //
       
   306 void CMusAvaDefaultImp::StartL()
       
   307     {
       
   308     MUS_LOG( "mus: [MUSAVA]  -> CMusAvaDefaultImp::StartL" )
       
   309     ExecuteAvailablitityModules();
       
   310     MUS_LOG( "mus: [MUSAVA]  <- CMusAvaDefaultImp::StartL" )
       
   311     }
       
   312 
       
   313 
       
   314 // -----------------------------------------------------------------------------
       
   315 // Requests the implementation to stop investigating or monitoring availabilites
       
   316 // for the client.
       
   317 // -----------------------------------------------------------------------------
       
   318 //
       
   319 void CMusAvaDefaultImp::Stop()
       
   320     {
       
   321     MUS_LOG( "mus: [MUSAVA]  -> CMusAvaDefaultImp::Stop" )
       
   322     iStopping = ETrue;
       
   323     for ( TInt i = iAvailabilities.Count() - 1; i >= 0; i-- )
       
   324         {
       
   325         if ( iAvailabilities[i]->State() > MMusAvaObserver::EMusAvaStatusNotExecuted )
       
   326             {
       
   327             iAvailabilities[i]->Stop();
       
   328             }
       
   329         }
       
   330     CalculateAvailability();
       
   331     iStopping = EFalse;
       
   332     if ( iObserver )
       
   333         {
       
   334         iObserver->AvailabilityChanged(
       
   335             CurrentAvailability(),
       
   336             AvailabilityStatus() );
       
   337         }
       
   338     MUS_LOG( "mus: [MUSAVA]  <- CMusAvaDefaultImp::Stop" )
       
   339     }
       
   340 
       
   341 
       
   342 // -----------------------------------------------------------------------------
       
   343 //  Availability report.
       
   344 // -----------------------------------------------------------------------------
       
   345 //
       
   346 void CMusAvaDefaultImp::AvailabilityChanged(
       
   347     MMusAvaObserver::TAvailabilityName aName,
       
   348     MMusAvaObserver::TAvailabilityStatus aStatus )
       
   349     {
       
   350     MUS_LOG2( "mus: [MUSAVA]  -> CMusAvaDefaultImp::AvailabilityChanged(%d,%d)",
       
   351         aName, aStatus )
       
   352 
       
   353     CalculateAvailability();
       
   354     if ( iObserver )
       
   355         {
       
   356         iObserver->AvailabilityChanged( aName, aStatus );
       
   357         }
       
   358         
       
   359     if ( !iStopping && aStatus >= MMusAvaObserver::EMusAvaStatusNotExecuted )
       
   360         {
       
   361         if ( !iExecuteStarted )
       
   362             {
       
   363             ExecuteAvailablitityModules();
       
   364             }
       
   365         }
       
   366     
       
   367     MUS_LOG( "mus: [MUSAVA]  <- CMusAvaDefaultImp::AvailabilityChanged()" )
       
   368     }
       
   369 
       
   370 
       
   371 // -----------------------------------------------------------------------------
       
   372 //  Availability error.
       
   373 // -----------------------------------------------------------------------------
       
   374 //
       
   375 void CMusAvaDefaultImp::AvailabilityError(
       
   376     MMusAvaObserver::TAvailabilityName aName,
       
   377     MMusAvaObserver::TAvailabilityStatus aStatus )
       
   378     {
       
   379     MUS_LOG2( "mus: [MUSAVA]  -> CMusAvaDefaultImp::AvailabilityError\
       
   380         ( %d, %d)", aName, aStatus )
       
   381 
       
   382     CalculateAvailability();
       
   383     if ( iObserver )
       
   384         {
       
   385         iObserver->AvailabilityError( aName, aStatus );
       
   386         }
       
   387     MUS_LOG( "mus: [MUSAVA]  <- CMusAvaDefaultImp::AvailabilityError()" )
       
   388     }
       
   389     
       
   390 // -----------------------------------------------------------------------------
       
   391 //  Checks if the current availability is at least the same as given as 
       
   392 //  parameter
       
   393 // -----------------------------------------------------------------------------
       
   394 //
       
   395 TBool CMusAvaDefaultImp::Available(
       
   396     MMusAvaObserver::TAvailabilityName aAvailability )
       
   397     {
       
   398     return iCurrentAvailability > aAvailability
       
   399       || ( iCurrentAvailability == aAvailability
       
   400        	&& MMusAvaObserver::EMusAvaStatusAvailable == iAvailabilityStatus )
       
   401       || ( iCurrentAvailability == aAvailability
       
   402        	&& ( MMusAvaObserver::EMusAvaStatusOptionsNotSent == iAvailabilityStatus
       
   403       	  ||  MMusAvaObserver::EMusAvaStatusOptionsSent == iAvailabilityStatus) );
       
   404     }
       
   405     
       
   406 // -----------------------------------------------------------------------------
       
   407 //  Calculates current availability
       
   408 // -----------------------------------------------------------------------------
       
   409 MMusAvaObserver::TAvailabilityStatus CMusAvaDefaultImp::AvailabilityPluginState()
       
   410 	{
       
   411 	return iAvailabilityStatus;
       
   412 	}
       
   413 // -----------------------------------------------------------------------------
       
   414 //  Calculates current availability
       
   415 // -----------------------------------------------------------------------------
       
   416 //
       
   417 void CMusAvaDefaultImp::CalculateAvailability()
       
   418     {
       
   419     MUS_LOG( "mus: [MUSAVA]  -> CMusAvaDefaultImp::CalculateAvailability()" )
       
   420     iCurrentAvailability = MMusAvaObserver::EMusAvaFullAvailability;
       
   421     iAvailabilityStatus = MMusAvaObserver::EMusAvaStatusAvailable;    
       
   422     TBool goOn = ETrue;
       
   423     for ( TInt i = 0; i < iAvailabilities.Count() && goOn; i++ )
       
   424         {
       
   425         if ( !iAvailabilities[i]->Available() )
       
   426             {
       
   427             iCurrentAvailability = iAvailabilities[i]->Name();
       
   428             iAvailabilityStatus = iAvailabilities[i]->State();
       
   429             goOn = EFalse;
       
   430             }
       
   431         }            
       
   432     MUS_LOG2( "mus: [MUSAVA]  Avaialability name and status (%d,%d)",
       
   433         iCurrentAvailability, iAvailabilityStatus )
       
   434     MUS_LOG( "mus: [MUSAVA]  <- CMusAvaDefaultImp::CalculateAvailability()" )
       
   435     }
       
   436 
       
   437 // -----------------------------------------------------------------------------
       
   438 //  Current availability
       
   439 // -----------------------------------------------------------------------------
       
   440 //
       
   441 MMusAvaObserver::TAvailabilityName CMusAvaDefaultImp::CurrentAvailability()
       
   442     {
       
   443     return iCurrentAvailability;
       
   444     }
       
   445 
       
   446 
       
   447 // -----------------------------------------------------------------------------
       
   448 //  Current availability status
       
   449 // -----------------------------------------------------------------------------
       
   450 //
       
   451 MMusAvaObserver::TAvailabilityStatus CMusAvaDefaultImp::AvailabilityStatus()
       
   452     {
       
   453     return iAvailabilityStatus;
       
   454     }
       
   455 
       
   456 
       
   457 // -----------------------------------------------------------------------------
       
   458 //  Checks if current availability is at least minimum availability
       
   459 // -----------------------------------------------------------------------------
       
   460 //
       
   461 TBool CMusAvaDefaultImp::MinimumAvailability()
       
   462     {
       
   463     return iCurrentAvailability > KMinimumAvailability;
       
   464     }
       
   465 
       
   466 
       
   467 // -----------------------------------------------------------------------------
       
   468 //  Checks if current availability is at least mandatory availability
       
   469 // -----------------------------------------------------------------------------
       
   470 //
       
   471 TBool CMusAvaDefaultImp::MandatoryAvailability()
       
   472     {
       
   473     return iCurrentAvailability > KMandatoryAvailability;
       
   474     }
       
   475 
       
   476 
       
   477 // -----------------------------------------------------------------------------
       
   478 //  Checks if current availability is extension availability
       
   479 // -----------------------------------------------------------------------------
       
   480 //
       
   481 TBool CMusAvaDefaultImp::ExtensionAvailability()
       
   482     {
       
   483     return iCurrentAvailability > KExtensionAvailability;
       
   484     }
       
   485 
       
   486 // -----------------------------------------------------------------------------
       
   487 //  Returns the sate of the given availability
       
   488 // -----------------------------------------------------------------------------
       
   489 //
       
   490 MMusAvaObserver::TAvailabilityStatus CMusAvaDefaultImp::AvailabilityState(
       
   491     MMusAvaObserver::TAvailabilityName aAvailability )
       
   492     {
       
   493     MUS_LOG1( "mus: [MUSAVA]  -> CMusAvaDefaultImp::AvailabilityState(%d)",
       
   494         aAvailability )
       
   495     MMusAvaObserver::TAvailabilityStatus retval = 
       
   496                                 MMusAvaObserver::EMusAvaStatusNotExecuted;
       
   497     MMusAvaObserver::TAvailabilityStatus state = 
       
   498                                 MMusAvaObserver::EMusAvaStatusAvailable;
       
   499                                 
       
   500     for ( TInt i = 0; i < iAvailabilities.Count() 
       
   501         && state > MMusAvaObserver::EMusAvaStatusNotExecuted; i++ )
       
   502         {
       
   503         state = iAvailabilities[i]->State();
       
   504         
       
   505         if ( iAvailabilities[i]->Name() == aAvailability )
       
   506             {
       
   507             retval = iAvailabilities[i]->State();
       
   508             }
       
   509         }
       
   510     MUS_LOG1( "mus: [MUSAVA]  <- CMusAvaDefaultImp::AvailabilityState(%d)",
       
   511         retval )
       
   512     return retval;
       
   513     }