convergedcallengine/cce/src/ccceconferencecall.cpp
changeset 0 ff3b6d0fd310
child 12 ae8abd0db65c
child 43 7d48bed6ce0c
equal deleted inserted replaced
-1:000000000000 0:ff3b6d0fd310
       
     1 /*
       
     2 * Copyright (c) 2006-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:  Base class of conference call object
       
    15 *
       
    16 */
       
    17 
       
    18 
       
    19 //  INCLUDE FILES
       
    20 #include "cconvergedcallprovider.h"
       
    21 #include "ccceconferencecall.h"
       
    22 #include "mccpconferencecall.h"
       
    23 #include "mcceconferencecallobserver.h"
       
    24 #include "cccepluginmanager.h"
       
    25 #include "cccecallcontainer.h"
       
    26 #include "cccecall.h"
       
    27 #include "cccelogger.h"
       
    28 #include "cccedurationtimer.h"
       
    29 
       
    30 // ======== MEMBER FUNCTIONS ========
       
    31 // ---------------------------------------------------------------------------
       
    32 // Constructor
       
    33 // ---------------------------------------------------------------------------
       
    34 //
       
    35 CCCEConferenceCall::CCCEConferenceCall(
       
    36         CCCECallContainer& aCallContainer,
       
    37         CCCEPluginManager& aPluginManager ):
       
    38         iPluginManager( aPluginManager ),
       
    39         iCallContainer( aCallContainer ),
       
    40         iCCEDurationTimer( NULL )
       
    41     {
       
    42     }
       
    43 
       
    44 // ---------------------------------------------------------------------------
       
    45 // Construct object
       
    46 // ---------------------------------------------------------------------------
       
    47 //
       
    48 void CCCEConferenceCall::ConstructL()
       
    49     {
       
    50     iCallParameters = CCCECallParameters::NewL();
       
    51     iCCEDurationTimer = CCCEDurationTimer::NewL();
       
    52     Reset();
       
    53     }
       
    54     
       
    55 // ---------------------------------------------------------------------------
       
    56 // Default Symbian constructor
       
    57 // ---------------------------------------------------------------------------
       
    58 //
       
    59 CCCEConferenceCall* CCCEConferenceCall::NewL(
       
    60         CCCECallContainer& aCallContainer,
       
    61         CCCEPluginManager& aPluginManager )
       
    62     {
       
    63     CCCEConferenceCall* self = new( ELeave ) CCCEConferenceCall(
       
    64         aCallContainer,
       
    65         aPluginManager );
       
    66     CleanupStack::PushL( self );
       
    67     self->ConstructL();
       
    68     CleanupStack::Pop( self );
       
    69     return self;
       
    70     }
       
    71 
       
    72 // ---------------------------------------------------------------------------
       
    73 // Destructor
       
    74 // ---------------------------------------------------------------------------
       
    75 //
       
    76 CCCEConferenceCall::~CCCEConferenceCall()
       
    77     {
       
    78     Reset();
       
    79     delete iCCEDurationTimer;
       
    80     delete iCallParameters;
       
    81     }
       
    82 
       
    83 // ---------------------------------------------------------------------------
       
    84 // SetObserver
       
    85 // ---------------------------------------------------------------------------
       
    86 //
       
    87 void CCCEConferenceCall::SetObserver(
       
    88     const MCCEConferenceCallObserver& aObserver )
       
    89     {
       
    90     CCELOGSTRING("CCCEConferenceCall::SetObserver()");
       
    91     iObserver = const_cast<MCCEConferenceCallObserver*>( &aObserver );
       
    92 
       
    93     if (iCCEDurationTimer)
       
    94         {
       
    95         iCCEDurationTimer->SetConferenceObserver(iObserver);
       
    96         }
       
    97     }
       
    98 
       
    99 // ---------------------------------------------------------------------------
       
   100 // Release()
       
   101 //
       
   102 // Closes conference call
       
   103 // ---------------------------------------------------------------------------
       
   104 //
       
   105 TInt CCCEConferenceCall::Release()
       
   106     {
       
   107     CCELOGSTRING("CCCEConferenceCall::Release()");
       
   108 
       
   109     // Reset timer observer
       
   110     iCCEDurationTimer->SetObserver( NULL );
       
   111     
       
   112     Reset();
       
   113     return KErrNone;
       
   114     }
       
   115 
       
   116 // ---------------------------------------------------------------------------
       
   117 // Reset()
       
   118 //
       
   119 // Resets conference call
       
   120 // ---------------------------------------------------------------------------
       
   121 //
       
   122 void CCCEConferenceCall::Reset()
       
   123     {
       
   124     CCELOGSTRING("CCCEConferenceCall::Reset()");
       
   125     iConferenceCaps = 1;
       
   126     
       
   127     iCallArray.Close();
       
   128     iState = MCCEConferenceCallObserver::ECCEConferenceIdle;
       
   129     
       
   130     if( iConferenceCall )
       
   131         {
       
   132         TRAP_IGNORE(iPluginManager.GetPluginL(
       
   133             iImplementationUid )->ReleaseConferenceCall( *iConferenceCall ));
       
   134         iConferenceCall = NULL;
       
   135         }
       
   136         
       
   137     iImplementationUid.iUid = 0; 
       
   138     
       
   139     iCallParameters->SetServiceId( 0 );
       
   140     
       
   141     if( iCCEDurationTimer )
       
   142         {
       
   143         iCCEDurationTimer->Reset();     
       
   144         }
       
   145     }
       
   146 
       
   147 // ---------------------------------------------------------------------------
       
   148 // State
       
   149 // ---------------------------------------------------------------------------
       
   150 //
       
   151 MCCEConferenceCallObserver::TCCEConferenceCallState 
       
   152     CCCEConferenceCall::State() const
       
   153     {
       
   154     return iState;
       
   155     }
       
   156 
       
   157 // ---------------------------------------------------------------------------
       
   158 // ServiceId
       
   159 // ---------------------------------------------------------------------------
       
   160 //
       
   161 TUint32 CCCEConferenceCall::ServiceId() const 
       
   162     {
       
   163     return iCallParameters->ServiceId();
       
   164     }
       
   165 
       
   166 // ---------------------------------------------------------------------------
       
   167 // ServiceId
       
   168 // ---------------------------------------------------------------------------
       
   169 //
       
   170 TUid CCCEConferenceCall::ImplementationUid() const 
       
   171     {
       
   172     return iImplementationUid;
       
   173     }
       
   174 
       
   175 // ---------------------------------------------------------------------------
       
   176 // AddCallL( const TName& aCallName )
       
   177 //
       
   178 // Adds the single voice call to an existing conference call. 
       
   179 // ---------------------------------------------------------------------------
       
   180 //
       
   181 void CCCEConferenceCall::AddCallL( MCCECall& aCall )
       
   182     {
       
   183     CCELOGSTRING("CCCEConferenceCall::AddCall()");
       
   184     CCCECall* call = static_cast<CCCECall*>( &aCall );
       
   185     
       
   186     if( !iConferenceCall )
       
   187         {
       
   188         iCallParameters->SetServiceId( call->ServiceId() );
       
   189         
       
   190         //This is needed for ccecallcontainer to check conf call type
       
   191         iCallParameters->SetCallType( call->CallType() );
       
   192         
       
   193         iImplementationUid = call->ImplementationUid();
       
   194 
       
   195         iConferenceCall = iPluginManager.GetPluginL(
       
   196             call->ImplementationUid() )->NewConferenceL( ServiceId(), *this );
       
   197 			
       
   198         if(iConferenceCall)
       
   199             {
       
   200             iConferenceCall->AddCallL( &call->GetCCPCall() );
       
   201             }
       
   202         else
       
   203             {
       
   204             User::Leave( KErrBadHandle );
       
   205             }
       
   206             
       
   207         }
       
   208     else // Add call to current conferencecall if possible
       
   209         {
       
   210         iConferenceCall->AddCallL( &call->GetCCPCall() );
       
   211         }
       
   212         
       
   213     }
       
   214 
       
   215 // ---------------------------------------------------------------------------
       
   216 // RemoveCallL( const TName& aCallName )
       
   217 //
       
   218 // Removes the single voice call to an existing conference call. 
       
   219 // ---------------------------------------------------------------------------
       
   220 //
       
   221 void CCCEConferenceCall::RemoveCallL( MCCECall& aCall )
       
   222     {
       
   223     CCELOGSTRING("CCCEConferenceCall::RemoveCallL()");
       
   224     CCCECall* call = static_cast<CCCECall*>( &aCall );
       
   225     
       
   226     if( iConferenceCall )
       
   227         {
       
   228         iConferenceCall->RemoveCallL( &call->GetCCPCall() );
       
   229         }
       
   230     else
       
   231         {
       
   232         User::Leave( KErrBadHandle );
       
   233         }
       
   234         
       
   235     }
       
   236 // ---------------------------------------------------------------------------
       
   237 // IsPartOfConference()
       
   238 //
       
   239 // Returns ETrue if aCall is part of conference 
       
   240 // ---------------------------------------------------------------------------
       
   241 //
       
   242 
       
   243 TBool CCCEConferenceCall::IsPartOfConference( CCCECall& aCall )
       
   244     {
       
   245     CCELOGSTRING("CCCEConferenceCall::IsPartOfConference()");
       
   246     TBool ret = EFalse;
       
   247     TInt index = iCallArray.FindInAddressOrder( &aCall );
       
   248     
       
   249     if( index != KErrNotFound )
       
   250         {
       
   251         ret = ETrue;
       
   252         }
       
   253         
       
   254     return ret;
       
   255     }
       
   256 
       
   257 // ---------------------------------------------------------------------------
       
   258 // SetOngoingConferenceCall()
       
   259 //
       
   260 // Sets plugin created conference call
       
   261 // ---------------------------------------------------------------------------
       
   262 //
       
   263 TInt CCCEConferenceCall::SetOngoingConferenceCall( 
       
   264     MCCPConferenceCall& aConferenceCall, 
       
   265     TUid aImplementationUid  )
       
   266     {
       
   267     CCELOGSTRING("CCCEConferenceCall::SetOngoingConferenceCall() IN");
       
   268     
       
   269     TInt err(KErrInUse);
       
   270 
       
   271     if( !iConferenceCall )
       
   272         {
       
   273         iConferenceCall = &aConferenceCall;
       
   274         TRAP_IGNORE( iConferenceCall->AddObserverL( *this ) );
       
   275         
       
   276         iConferenceCaps = 
       
   277             MCCEConferenceCallObserver::KCCECapsHangUp |
       
   278             MCCEConferenceCallObserver::KCCECapsSwap;
       
   279         
       
   280         iImplementationUid = aImplementationUid;
       
   281 
       
   282         err = KErrNone;
       
   283         
       
   284         RPointerArray<MCCPCall> array;
       
   285         iConferenceCall->GetCallArray( array );
       
   286         
       
   287         for( TInt i = 0; i < array.Count(); i++ )
       
   288             {
       
   289             const CCCECall* call = iCallContainer.GetCall( array[i] );
       
   290             
       
   291             // Check if cce call matching to ccp call is available
       
   292             iCallArray.Append( call );
       
   293             iCallParameters->SetServiceId( call->ServiceId() );
       
   294                 
       
   295             CCELOGSTRING("CCCEConferenceCall:: Call added to conferencecall");
       
   296             }
       
   297 
       
   298         TInt offset(0);
       
   299         for (TInt a = 0; a < iCallArray.Count(); a++)
       
   300             {
       
   301             TInt beats = iCallArray[a]->CallDuration().Int();
       
   302             if (beats > offset)   
       
   303                 {
       
   304                 offset = beats;   
       
   305                 }
       
   306             } 
       
   307         iCCEDurationTimer->Start(offset);
       
   308 
       
   309         array.Close();
       
   310         }
       
   311     
       
   312     CCELOGSTRING("CCCEConferenceCall::SetOngoingConferenceCall() OUT");
       
   313     return err;
       
   314     }
       
   315 
       
   316 // ---------------------------------------------------------------------------
       
   317 // EnumerateCalls()
       
   318 //
       
   319 // Returns the member count of the conference call. 
       
   320 // ---------------------------------------------------------------------------
       
   321 //
       
   322 TInt CCCEConferenceCall::EnumerateCalls()
       
   323     {
       
   324     CCELOGSTRING("CCCEConferenceCall::EnumerateCalls()");
       
   325     return iCallArray.Count();
       
   326     }
       
   327 
       
   328 // ---------------------------------------------------------------------------
       
   329 // GetCaps()
       
   330 //
       
   331 // Gets the current capabilities of the conference call.
       
   332 // ---------------------------------------------------------------------------
       
   333 //
       
   334 MCCEConferenceCallObserver::TCCEConferenceCallCaps CCCEConferenceCall::Caps() const
       
   335     {
       
   336     CCELOGSTRING("CCCEConferenceCall::GetCaps()");
       
   337     return (MCCEConferenceCallObserver::TCCEConferenceCallCaps)iConferenceCaps;
       
   338     }
       
   339 
       
   340 // ---------------------------------------------------------------------------
       
   341 // Parameters() const
       
   342 // ---------------------------------------------------------------------------
       
   343 //
       
   344 const CCCPCallParameters& CCCEConferenceCall::Parameters() const
       
   345     {
       
   346     return *iCallParameters;
       
   347     }
       
   348 
       
   349 // ---------------------------------------------------------------------------
       
   350 // HangUp()
       
   351 //
       
   352 // Terminates the conference.
       
   353 // ---------------------------------------------------------------------------
       
   354 //
       
   355 TInt CCCEConferenceCall::HangUp()
       
   356     {
       
   357     CCELOGSTRING("CCCEConferenceCall::HangUp()");
       
   358     iCCEDurationTimer->Stop();
       
   359     return iConferenceCall->HangUp();
       
   360     }
       
   361 
       
   362 // ---------------------------------------------------------------------------
       
   363 // Swap()
       
   364 //
       
   365 // Allows a client to switch a conference call between "Active" 
       
   366 // and "Hold" states.
       
   367 // ---------------------------------------------------------------------------
       
   368 //
       
   369 TInt CCCEConferenceCall::Swap()
       
   370     {
       
   371     CCELOGSTRING("CCCEConferenceCall::Swap()");
       
   372     return iConferenceCall->Swap();
       
   373     }
       
   374 
       
   375 // ---------------------------------------------------------------------------
       
   376 // GoOneToOneL()
       
   377 // ---------------------------------------------------------------------------
       
   378 //
       
   379 void CCCEConferenceCall::GoOneToOneL( MCCECall& aCall )
       
   380     {
       
   381     CCELOGSTRING("CCCEConferenceCall::GoOneToOne()");
       
   382     CCCECall* call = static_cast<CCCECall*>( &aCall );
       
   383     iConferenceCall->GoOneToOneL( call->GetCCPCall() );
       
   384     }
       
   385 
       
   386 // ---------------------------------------------------------------------------
       
   387 // GetCallArray()
       
   388 // ---------------------------------------------------------------------------
       
   389 //
       
   390 TInt CCCEConferenceCall::GetCallArray( RPointerArray<MCCECall>& aCallArray )
       
   391     {
       
   392     TInt err( KErrNotFound );
       
   393     
       
   394     for (TInt a = 0; a < iCallArray.Count(); a++)
       
   395         {
       
   396         aCallArray.Append( iCallArray[a] );
       
   397         err = KErrNone;
       
   398         }
       
   399 
       
   400     
       
   401     return err;
       
   402     }
       
   403 
       
   404 // ---------------------------------------------------------------------------
       
   405 // ConferenceCallEventOccurred()
       
   406 // ---------------------------------------------------------------------------
       
   407 //
       
   408 void CCCEConferenceCall::ErrorOccurred( const TCCPConferenceCallError aError )
       
   409     {
       
   410     CCELOGSTRING("CCCEConferenceCall::ErrorOccurred()");
       
   411     
       
   412     iCallContainer.ErrorOccurred( NULL, ECCPErrorGeneral );
       
   413         
       
   414     iObserver->ErrorOccurred( aError );
       
   415     }
       
   416 
       
   417 // ---------------------------------------------------------------------------
       
   418 // ConferenceCallCapsChanged()
       
   419 // ---------------------------------------------------------------------------
       
   420 //
       
   421 void CCCEConferenceCall::ConferenceCallCapsChanged( 
       
   422     const TCCPConferenceCallCaps aCaps )
       
   423     {
       
   424     CCELOGSTRING2(
       
   425         "CCCEConferenceCall::ConferenceCallStateChanged() Caps = %d", aCaps );
       
   426         
       
   427     CapsChanged( aCaps );
       
   428     }
       
   429     
       
   430 // ---------------------------------------------------------------------------
       
   431 // ConferenceCallEventOccurred()
       
   432 // ---------------------------------------------------------------------------
       
   433 //
       
   434 void CCCEConferenceCall::ConferenceCallStateChanged( 
       
   435     const TCCPConferenceCallState aState )
       
   436     {
       
   437     CCELOGSTRING2(
       
   438         "CCCEConferenceCall::ConferenceCallStateChanged() State = %d", aState );
       
   439     TInt offset(0);
       
   440     switch( aState )
       
   441         {
       
   442         /** The conference call is in the idle state. */
       
   443         case ECCPConferenceIdle:
       
   444             CCELOGSTRING(
       
   445                 "CCCEConferenceCall::ConferenceCallStateChanged() ECCPConferenceIdle");
       
   446             iState = MCCEConferenceCallObserver::ECCEConferenceIdle;
       
   447             DeActivate();
       
   448             iObserver->CallStateChanged( 
       
   449                 MCCEConferenceCallObserver::ECCEConferenceIdle );
       
   450               
       
   451             iCallContainer.HandleConferenceStatusChange( 
       
   452                 MCCEConferenceCallObserver::ECCEConferenceIdle );
       
   453 
       
   454             // Stop duration timer
       
   455             iCCEDurationTimer->Stop();
       
   456           
       
   457             break;
       
   458         /** The conference call is in the active, connected state. */
       
   459         case ECCPConferenceActive:
       
   460             CCELOGSTRING(
       
   461                 "CCCEConferenceCall::ConferenceCallStateChanged() ECCPConferenceActive");
       
   462             iState = MCCEConferenceCallObserver::ECCEConferenceActive;
       
   463             iObserver->CallStateChanged( 
       
   464                 MCCEConferenceCallObserver::ECCEConferenceActive );
       
   465             iCallContainer.HandleConferenceStatusChange( 
       
   466                 MCCEConferenceCallObserver::ECCEConferenceActive );
       
   467 
       
   468             // Start call duration timer
       
   469             
       
   470             for (TInt a = 0; a < iCallArray.Count(); a++)
       
   471                 {
       
   472                  TInt beats = iCallArray[a]->CallDuration().Int();
       
   473                  if (beats > offset)   
       
   474                     {
       
   475                      offset = beats;   
       
   476                     }
       
   477                 } 
       
   478             iCCEDurationTimer->Start(offset);
       
   479 
       
   480             break;
       
   481         /** The conference call is in the held, connected state. */
       
   482         case ECCPConferenceHold:
       
   483             CCELOGSTRING(
       
   484                 "CCCEConferenceCall::ConferenceCallStateChanged() ECCPConferenceHold");
       
   485             iState = MCCEConferenceCallObserver::ECCEConferenceHold;
       
   486             iObserver->CallStateChanged( 
       
   487                 MCCEConferenceCallObserver::ECCEConferenceHold );
       
   488             iCallContainer.HandleConferenceStatusChange( 
       
   489                 MCCEConferenceCallObserver::ECCEConferenceHold );
       
   490             break;
       
   491         default:
       
   492             break;
       
   493         }
       
   494         
       
   495     }
       
   496 
       
   497 // ---------------------------------------------------------------------------
       
   498 // ConferenceCallEventOccurred()
       
   499 // ---------------------------------------------------------------------------
       
   500 //
       
   501 void CCCEConferenceCall::ConferenceCallEventOccurred( 
       
   502      const TCCPConferenceCallEvent aEvent,
       
   503      MCCPCall* aReferredCall )
       
   504     {
       
   505     CCELOGSTRING2(
       
   506         "CCCEConferenceCall::ConferenceCallEventOccurred() aEvent = %d", aEvent );
       
   507     CCCECall* call = NULL;
       
   508     
       
   509     if( aReferredCall )
       
   510         {
       
   511         call = iCallContainer.GetCall( aReferredCall );
       
   512         }
       
   513 
       
   514     switch( aEvent )
       
   515         {
       
   516         /** Conference call added. TODO, do we need call pointer with this 
       
   517             notification? and a existing call pointer list of the conference?*/
       
   518         case ECCPConferenceCallAdded:
       
   519         
       
   520             if( call )
       
   521                 {
       
   522                 CCELOGSTRING(
       
   523                     "CCCEConferenceCall::ConferenceCallEventOccurred():CallAdded");
       
   524                 iCallArray.InsertInAddressOrder( call );
       
   525                 iObserver->CallEventOccurred( 
       
   526                     MCCEConferenceCallObserver::ECCEConferenceCallAdded, call);
       
   527                 
       
   528                 iCallParameters->SetServiceId( call->ServiceId() );
       
   529                 iImplementationUid = call->ImplementationUid();
       
   530                 }
       
   531                 
       
   532             break;
       
   533         /** Conference call removed */
       
   534         case ECCPConferenceCallRemoved:
       
   535         
       
   536             if( call )
       
   537                 {
       
   538                 TInt index = iCallArray.FindInAddressOrder( call );
       
   539                 
       
   540                 if( index != KErrNotFound )
       
   541                     {
       
   542                     CCELOGSTRING(
       
   543                         "CCCEConferenceCall::ConferenceCallEventOccurred():CallRemoved");
       
   544 
       
   545                     iCallArray.Remove( index );
       
   546                     iCallArray.Compress();
       
   547 
       
   548                     iObserver->CallEventOccurred( 
       
   549                         MCCEConferenceCallObserver::ECCEConferenceCallRemoved, call);
       
   550                     iObserver->ErrorOccurred((TCCPConferenceCallError)KErrNone);
       
   551                          
       
   552                     }
       
   553                 else
       
   554                     {
       
   555                     CCELOGSTRING(
       
   556                         "CCCEConferenceCall::ConferenceCallEventOccurred(): Call not found");
       
   557                     }
       
   558                     
       
   559                 }
       
   560                 
       
   561             break;
       
   562         /** Names of the two calls used to build the conference call 
       
   563             returned in aCallName. */
       
   564         case ECCPConferenceBuilt:
       
   565             CCELOGSTRING(
       
   566                 "CCCEConferenceCall::ConferenceCallEventOccurred():ECCPConferenceBuilt");
       
   567             iObserver->CallEventOccurred( 
       
   568                 MCCEConferenceCallObserver::ECCEConferenceBuilt, call); 
       
   569             break;
       
   570         /** No name provided */
       
   571         case ECCPConferenceTerminated:
       
   572             CCELOGSTRING(
       
   573                 "CCCEConferenceCall::ConferenceCallEventOccurred():ECCPConferenceTerminated");
       
   574                    
       
   575             iObserver->CallEventOccurred( 
       
   576                 MCCEConferenceCallObserver::ECCEConferenceTerminated, call);
       
   577             break;
       
   578         /** No name provided. */
       
   579         case ECCPConferenceSwapped:
       
   580             CCELOGSTRING(
       
   581                 "CCCEConferenceCall::ConferenceCallEventOccurred():ECCPConferenceSwapped");
       
   582             iObserver->CallEventOccurred( 
       
   583                 MCCEConferenceCallObserver::ECCEConferenceSwapped, call); 
       
   584             break;
       
   585         /** Name of the call being seperated. */
       
   586         case ECCPConferenceSplit:
       
   587             CCELOGSTRING(
       
   588                 "CCCEConferenceCall::ConferenceCallEventOccurred():ECCPConferenceSplit");
       
   589             iObserver->CallEventOccurred( 
       
   590                 MCCEConferenceCallObserver::ECCEConferenceSplit, call); 
       
   591             break;
       
   592         default:
       
   593             break;
       
   594 
       
   595         }
       
   596     }
       
   597 
       
   598 // ---------------------------------------------------------------------------
       
   599 // CapsChanged()
       
   600 // ---------------------------------------------------------------------------
       
   601 //
       
   602 void CCCEConferenceCall::CapsChanged( TInt aCaps )
       
   603     {
       
   604     if( aCaps != iConferenceCaps )
       
   605         {
       
   606         CCELOGSTRING2("CCCEConferenceCall::CapsChanged() aCaps = %d", aCaps);
       
   607         iConferenceCaps = aCaps;
       
   608 
       
   609         iObserver->CallCapsChanged(
       
   610             (MCCEConferenceCallObserver::TCCEConferenceCallCaps)iConferenceCaps );
       
   611         }
       
   612     }
       
   613 
       
   614 
       
   615 // ---------------------------------------------------------------------------
       
   616 // DeActivate()
       
   617 // ---------------------------------------------------------------------------
       
   618 // 
       
   619 void CCCEConferenceCall::DeActivate()
       
   620     {
       
   621     CCELOGSTRING("CCCEConferenceCall::DeActivate():Conference idle");
       
   622         
       
   623     iCallArray.Reset();
       
   624     
       
   625     const TInt caps = MCCEConferenceCallObserver::KCCECapsCreate; // Create
       
   626     CapsChanged( caps );
       
   627     }
       
   628 
       
   629 // ---------------------------------------------------------------------------
       
   630 // CallDuration()
       
   631 // ---------------------------------------------------------------------------
       
   632 // 
       
   633 TTimeIntervalSeconds CCCEConferenceCall::CallDuration() const
       
   634 	{
       
   635     return iCCEDurationTimer->NumberOfBeats();
       
   636 	}
       
   637     
       
   638 // End of file