multimediacommsengine/mmcesrv/mmceserver/src/mcecssession.cpp
changeset 0 1bce908db942
equal deleted inserted replaced
-1:000000000000 0:1bce908db942
       
     1 /*
       
     2 * Copyright (c) 2005 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:  
       
    15 *
       
    16 */
       
    17 
       
    18 
       
    19 
       
    20 
       
    21 #include <badesca.h>
       
    22 
       
    23 #include "mceservercore.h"
       
    24 #include "mcecssessionimplementation.h"
       
    25 #include "mcecsserver.h"
       
    26 #include "mcecssession.h"
       
    27 #include "mcecomaudiocodec.h"
       
    28 #include "mcecomvideocodec.h"
       
    29 #include "mcecssessionreceiver.h"
       
    30 #include "mcecssubsessionreceiver.h"
       
    31 #include "mcecssubsession.h"
       
    32 #include "mcecsserveritc.h"
       
    33 #include "mcesipmanager.h"
       
    34 #include "mcemediamanager.h"
       
    35 #include "mcesrvlogs.h"
       
    36 #include "mceserial.h"
       
    37 #include "mcemessagedispatcher.h"
       
    38 
       
    39 // -----------------------------------------------------------------------------
       
    40 // CMceCsSession::NewL
       
    41 // -----------------------------------------------------------------------------
       
    42 //
       
    43 CMceCsSession* CMceCsSession::NewL( CMceServerCore& aServerCore )
       
    44 	{
       
    45     CMceCsSession* self = CMceCsSession::NewLC( aServerCore );
       
    46     CleanupStack::Pop(self);
       
    47     return self;
       
    48 	}
       
    49 
       
    50 // -----------------------------------------------------------------------------
       
    51 // CMceCsSession::NewLC
       
    52 // -----------------------------------------------------------------------------
       
    53 //
       
    54 CMceCsSession* CMceCsSession::NewLC( CMceServerCore& aServerCore )
       
    55 	{
       
    56     CMceCsSession* self = new (ELeave) CMceCsSession( aServerCore );
       
    57     CleanupStack::PushL( self );
       
    58     self->ConstructL();
       
    59     return self;
       
    60 	}
       
    61 
       
    62 
       
    63 // -----------------------------------------------------------------------------
       
    64 // CMceCsSession::CMceCsSession
       
    65 // -----------------------------------------------------------------------------
       
    66 //
       
    67 CMceCsSession::CMceCsSession (CMceServerCore& aServerCore)
       
    68 : iServerCore (aServerCore)
       
    69 	{
       
    70     iServerCore.IncrementSessions();
       
    71 	}
       
    72 
       
    73 // -----------------------------------------------------------------------------
       
    74 // CMceCsSession::ConstructL
       
    75 // -----------------------------------------------------------------------------
       
    76 //
       
    77 void CMceCsSession::ConstructL ()
       
    78 	{
       
    79     MCESRV_DEBUG("CMceCsSession::ConstructL, Entry");
       
    80 
       
    81 	iITC = CMceCsServerITC::NewL();
       
    82     iImpl = CMceCsSessionImplementation::NewL( iServerCore.Manager(), this );
       
    83 	
       
    84     MCESRV_DEBUG("CMceCsSession::ConstructL, Exit");
       
    85     
       
    86 	}
       
    87 
       
    88 
       
    89 // -----------------------------------------------------------------------------
       
    90 // CMceCsSession::CreateSubSessionReceiverL
       
    91 // -----------------------------------------------------------------------------
       
    92 //
       
    93 CMceCsSubSessionReceiver* CMceCsSession::CreateSubSessionReceiverL ()
       
    94 	{
       
    95     return CMceCsSubSessionReceiver::NewL( ITC() );
       
    96 	}
       
    97 
       
    98 
       
    99 
       
   100 // -----------------------------------------------------------------------------
       
   101 // CMceCsSession::Implementation
       
   102 // -----------------------------------------------------------------------------
       
   103 //
       
   104 CMceCsSessionImplementation& CMceCsSession::Implementation()
       
   105     {
       
   106     return *iImpl;
       
   107     }
       
   108 
       
   109 // -----------------------------------------------------------------------------
       
   110 // CMceCsSession::~CMceCsSession
       
   111 // -----------------------------------------------------------------------------
       
   112 //
       
   113 CMceCsSession::~CMceCsSession()
       
   114 	{
       
   115     MCESRV_DEBUG("CMceCsSession::~CMceCsSession, Entry");
       
   116     
       
   117     iServerCore.DecrementSessions();
       
   118     iServerCore.Manager().UnRegisterClient( *this );
       
   119     if ( iImpl )
       
   120         {
       
   121         iImpl->RemoveAllSubSessions();
       
   122         delete iImpl;
       
   123         iImpl = NULL;
       
   124         }
       
   125     iReceivers.ResetAndDestroy();
       
   126     iReceivers.Close();
       
   127     delete iITC;
       
   128     
       
   129     MCESRV_DEBUG("MCE Server session deleted");
       
   130     
       
   131     MCESRV_DEBUG("CMceCsSession::~CMceCsSession, Exit");
       
   132 	}
       
   133 
       
   134 // -----------------------------------------------------------------------------
       
   135 // CMceCsSession::ServerCore
       
   136 // -----------------------------------------------------------------------------
       
   137 //
       
   138 CMceServerCore& CMceCsSession::ServerCore ()
       
   139     {
       
   140     return iServerCore;
       
   141     }
       
   142     
       
   143     
       
   144     
       
   145 // -----------------------------------------------------------------------------
       
   146 // CMceCsSession::ServiceL
       
   147 // From CSession
       
   148 // -----------------------------------------------------------------------------
       
   149 //
       
   150 void CMceCsSession::ServiceL( const RMessage2& aMessage )
       
   151 	{
       
   152 	TInt error = KErrNone;
       
   153 	
       
   154     MCESRV_DEBUG("CMceCsSession::ServiceL, Entry");
       
   155 	
       
   156 #ifdef PLAT_SEC_TEST  
       
   157 	iITC->Complete(aMessage, KErrNone);
       
   158 	return;
       
   159 #endif
       
   160 
       
   161 	TInt function = iITC->Function( aMessage );
       
   162 	TMceIds ids = iITC->ReadMCEIdsL( aMessage );
       
   163     TRAP( error, DoServiceL( function, aMessage ) );
       
   164     if ( error != KErrNone )
       
   165 	    {
       
   166         MCESRV_DEBUG_DVALUE("ServiceL: Error occured in session/subsession. ERROR", error );
       
   167 	    iITC->WriteL(aMessage, ids);
       
   168 	    if ( function == EMceItcClientReadyToReceive ||
       
   169 	         function == EMceItcClientCancelReceive )
       
   170 		    {
       
   171             MCESRV_DEBUG("ServiceL: Error occured in ClientReadyToReceiveL -> Stop receive" );
       
   172 		   	error = KErrCompletion;
       
   173 		    }
       
   174 	    }
       
   175 	    
       
   176     MCESRV_DEBUG("CMceCsSession::ServiceL, Exit");
       
   177 
       
   178 	User::LeaveIfError( error );
       
   179 
       
   180 	
       
   181 	}
       
   182 
       
   183 
       
   184 // -----------------------------------------------------------------------------
       
   185 // CMceCsSession::DoServiceL
       
   186 // -----------------------------------------------------------------------------
       
   187 //
       
   188 void CMceCsSession::DoServiceL( TInt aFunction, const RMessage2& aMessage )
       
   189     {
       
   190     MCESRV_DEBUG("CMceCsSession::ServiceL, Entry");
       
   191 	 
       
   192     MCESRV_DEBUG_EVENT("ITC", aFunction);
       
   193 
       
   194     TMceIds ids = iITC->ReadMCEIdsL( aMessage );
       
   195     
       
   196     MCESRV_DEBUG_IDS("IDS", ids );
       
   197     
       
   198     if ( ids.IsAppUIDId() )
       
   199     	{
       
   200     	 
       
   201    	 	MCESRV_DEBUG("passing to manager receiver");
       
   202    	 	switch (aFunction)
       
   203 			{
       
   204         	case EMceItcSetAppUid:
       
   205         		{
       
   206             	SetClientUidL(ids, aMessage);
       
   207             	break; 
       
   208         		}
       
   209         	case EMceItcCreateSession:
       
   210         		{
       
   211             	CreateSubSessionL(ids, aMessage);
       
   212             	break; 
       
   213         		}
       
   214 			case EMceItcDeleteSession:
       
   215         		{
       
   216             	DeleteSubSessionL(ids, aMessage);
       
   217             	break; 
       
   218         		}
       
   219         	case EMceItcClientCancelReceive:
       
   220         		{
       
   221             	CancelClientReceiveL( ids );
       
   222         		break;
       
   223         		}
       
   224         	case EMceItcClientReadyToReceive: // Asynchronous. Do not complete yet.
       
   225         		{
       
   226             	ClientReadyToReceiveL(ids, aMessage);
       
   227             	return; 
       
   228         		}
       
   229         	case EMceItcGetSupportedAudioCodecs:
       
   230         	case EMceItcGetSupportedVideoCodecs:
       
   231         		{
       
   232         		SupportedCodecsL(aFunction, aMessage);
       
   233         		break;
       
   234         		}
       
   235 			case EMceItcDisplaysAvailable:
       
   236 			case EMceItcCameraInfo:
       
   237 			case EMceItcCamerasAvailable:
       
   238             case EMceItcTranscode:
       
   239             case EMceItcTranscodeWithSession:
       
   240             case EMceItcCancelTranscode:
       
   241             case EMceItcFileInfo:
       
   242 			case EMceItcMaxVolume:
       
   243 			case EMceItcMaxGain:
       
   244 			    {
       
   245 			    MediaServiceL( ids, (TMceItcFunctions)aFunction, aMessage );
       
   246 			    break;
       
   247 			    }
       
   248 	        case EMceItcReceive:
       
   249 	        	{
       
   250 	            ReceiveL (ids, aMessage);
       
   251 	            break;		    
       
   252 	        	} 
       
   253 			case EMceItcSetDefaultHeaders:
       
   254                 {
       
   255                 StoreDefaultHeadersL( aMessage );
       
   256                 break;
       
   257                 }
       
   258 			case EMceItcGetDefaultHeaders:
       
   259 			    {
       
   260 			    DefaultHeadersL( aMessage );
       
   261 			    break;
       
   262 			    }
       
   263             default:
       
   264             	{
       
   265             	#ifndef ALLOW_NOT_SUPPORTED_ITC
       
   266             	User::Leave(KErrNotSupported);
       
   267             	#endif
       
   268             	}
       
   269 			}
       
   270 			iITC->WriteL(aMessage, ids);
       
   271 	        iITC->Complete(aMessage, KErrNone);
       
   272 	    }
       
   273 	else
       
   274     	{
       
   275    	 	MCESRV_DEBUG("passing to session receiver");
       
   276         CallSubSessionL(ids, aFunction, aMessage);
       
   277     	}
       
   278     	
       
   279     MCESRV_DEBUG("CMceCsSession::ServiceL, Exit");
       
   280     
       
   281     }
       
   282 
       
   283 
       
   284 // -----------------------------------------------------------------------------
       
   285 // CMceCsSession::Uid
       
   286 // -----------------------------------------------------------------------------
       
   287 //
       
   288 TUid CMceCsSession::Uid()
       
   289 	{
       
   290 	return iClientUid;
       
   291 	}
       
   292 
       
   293 
       
   294 // -----------------------------------------------------------------------------
       
   295 // CMceCsSession::SetClientUidL
       
   296 // -----------------------------------------------------------------------------
       
   297 //
       
   298 void CMceCsSession::SetClientUidL (TMceIds& aIds, const RMessage2& /*aMessage*/)
       
   299 	{
       
   300     MCESRV_DEBUG("CMceCsSession::SetClientUidL, Entry");
       
   301 	
       
   302 	TInt id = (TInt) aIds.iAppUID;
       
   303 	iClientUid = TUid::Uid(id);
       
   304 	ServerCore().Manager().RegisterClientL( *this );
       
   305 	
       
   306     MCESRV_DEBUG("CMceCsSession::SetClientUidL, Exit");
       
   307 	
       
   308 	}
       
   309 
       
   310 // -----------------------------------------------------------------------------
       
   311 // CMceCsSession::ClientReadyToReceiveL
       
   312 // -----------------------------------------------------------------------------
       
   313 //
       
   314 void CMceCsSession::ClientReadyToReceiveL (TMceIds& aIds, const RMessage2& aMessage)
       
   315 	{
       
   316     MCESRV_DEBUG("CMceCsSession::ClientReadyToReceiveL, Entry");
       
   317 
       
   318     ReceiverL( aIds )->ClientReadyToReceiveL (aMessage);
       
   319 
       
   320     MCESRV_DEBUG("CMceCsSession::ClientReadyToReceiveL, Exit");
       
   321     
       
   322 	}
       
   323 	
       
   324 
       
   325 // -----------------------------------------------------------------------------
       
   326 // CMceCsSession::CancelClientReceiveL
       
   327 // -----------------------------------------------------------------------------
       
   328 //
       
   329 void CMceCsSession::CancelClientReceiveL ( TMceIds& aIds )
       
   330 	{
       
   331     MCESRV_DEBUG("CMceCsSession::CancelClientReceiveL, Entry");
       
   332 
       
   333     ReceiverL( aIds )->CancelClientReceiveL();
       
   334 
       
   335     MCESRV_DEBUG("CMceCsSession::CancelClientReceiveL, Exit");
       
   336 	}
       
   337 
       
   338 // -----------------------------------------------------------------------------
       
   339 // CMceCsSession::SupportedCodecsL
       
   340 // -----------------------------------------------------------------------------
       
   341 //
       
   342 void CMceCsSession::SupportedCodecsL( TInt aFunction, const RMessage2& aMessage )
       
   343 	{
       
   344     MCESRV_DEBUG("CMceCsSession::SupportedCodecsL, Entry");
       
   345 
       
   346     HBufC8* codecs = NULL;
       
   347 
       
   348 	if ( aFunction == EMceItcGetSupportedAudioCodecs )
       
   349 	    {
       
   350         codecs = iImpl->SupportedAudioCodecsL();
       
   351 	    }
       
   352     else
       
   353         {
       
   354         codecs = iImpl->SupportedVideoCodecsL();
       
   355         }
       
   356 
       
   357     CleanupStack::PushL( codecs );
       
   358     iITC->WriteL( aMessage, *codecs, EMceItcArgContext);
       
   359 
       
   360     CleanupStack::PopAndDestroy( codecs );
       
   361 
       
   362     MCESRV_DEBUG("CMceCsSession::SupportedCodecsL, Exit");
       
   363     
       
   364 	}
       
   365 
       
   366 // -----------------------------------------------------------------------------
       
   367 // CMceCsSession::MediaServiceL
       
   368 // -----------------------------------------------------------------------------
       
   369 //
       
   370 void CMceCsSession::MediaServiceL( TMceIds& aIds, TMceItcFunctions aFunction, 
       
   371                                 const RMessage2& aMessage )
       
   372     {
       
   373 
       
   374     MCESRV_DEBUG("CMceCsSession::MediaServiceL, Entry");
       
   375 
       
   376     TMceMessageDispatcher<CMceCsSessionImplementation> dispatcher( *iImpl, *iITC );
       
   377     
       
   378     dispatcher.DispatchL( aIds, aFunction, aMessage );
       
   379 
       
   380     MCESRV_DEBUG("CMceCsSubSession::MediaServiceL, Exit");
       
   381         
       
   382     }
       
   383     
       
   384     
       
   385 
       
   386 
       
   387 // -----------------------------------------------------------------------------
       
   388 // CMceCsSession::CallSubSessionL
       
   389 // -----------------------------------------------------------------------------
       
   390 //
       
   391 void CMceCsSession::CallSubSessionL (TMceIds& aIds, TInt aFunction,
       
   392                                      const RMessage2& aMessage)
       
   393     {
       
   394     
       
   395 	CMceCsSubSession* subSession = iImpl->SubSessionL( aIds.iSessionID );
       
   396     subSession->ServiceL( aIds, (TMceItcFunctions)aFunction, aMessage);
       
   397     
       
   398     }
       
   399 
       
   400 
       
   401 
       
   402 // -----------------------------------------------------------------------------
       
   403 // CMceCsSession::CreateSubSessionL
       
   404 // -----------------------------------------------------------------------------
       
   405 //
       
   406 void CMceCsSession::CreateSubSessionL( TMceIds& aIds, const RMessage2& aMessage )
       
   407     {
       
   408 
       
   409     MCESRV_DEBUG("CMceCsSession::CreateSubSessionL, Entry");
       
   410         
       
   411     HBufC8* encodedMessage = NULL;
       
   412     encodedMessage = ITC().ReadLC( aMessage, EMceItcArgContext );
       
   413     
       
   414     CMceMsgTextArray* msgParams = new (ELeave) CMceMsgTextArray();
       
   415     CleanupStack::PushL( msgParams );
       
   416     
       
   417     msgParams->DecodeL( *encodedMessage );
       
   418     
       
   419     CDesC8Array* params = msgParams->iArray;
       
   420     CleanupStack::PushL( params );
       
   421     
       
   422     iImpl->CreateSubSessionL( aIds, *params );
       
   423         
       
   424     CleanupStack::PopAndDestroy( params );
       
   425     CleanupStack::PopAndDestroy( msgParams );
       
   426     CleanupStack::PopAndDestroy( encodedMessage );
       
   427         
       
   428     iITC->WriteL(aMessage, aIds);
       
   429     
       
   430     MCESRV_DEBUG("CMceCsSession::CreateSubSessionL, Exit");
       
   431     }
       
   432 
       
   433 // -----------------------------------------------------------------------------
       
   434 // CMceCsSession::DeleteSubSessionL
       
   435 // -----------------------------------------------------------------------------
       
   436 //
       
   437 void CMceCsSession::DeleteSubSessionL( TMceIds& /*aIds*/, const RMessage2& aMessage )
       
   438     {
       
   439 
       
   440     MCESRV_DEBUG("CMceCsSession::DeleteSubSessionL, Entry");
       
   441 
       
   442     TUint32 sessionId = iITC->ReadTUint32L(aMessage, EMceItcArgId );
       
   443     iImpl->RemoveSubSessionL( sessionId );
       
   444 	
       
   445     MCESRV_DEBUG("CMceCsSession::DeleteSubSessionL, Exit");
       
   446     }
       
   447 
       
   448 
       
   449 // -----------------------------------------------------------------------------
       
   450 // CMceCsSession::Receiver
       
   451 // -----------------------------------------------------------------------------
       
   452 //
       
   453 CMceCsSessionReceiver* CMceCsSession::ReceiverL( TMceIds& aIds )
       
   454     {
       
   455 	TMceManagerType type = aIds.iManagerType;
       
   456     CMceCsSessionReceiver* receiver = NULL;
       
   457     
       
   458     TInt index = 0;
       
   459     while( !receiver && index < iReceivers.Count() )
       
   460         {
       
   461         if ( iReceivers[ index ]->Type() == type )
       
   462             {
       
   463             receiver = iReceivers[ index ];
       
   464             }
       
   465         index++;            
       
   466         }
       
   467 
       
   468     if (!receiver )
       
   469         {
       
   470         receiver = CMceCsSessionReceiver::NewLC( type, *iITC );
       
   471         iReceivers.AppendL( receiver );
       
   472         CleanupStack::Pop( receiver );
       
   473         }
       
   474         
       
   475     return receiver;
       
   476     
       
   477     }
       
   478 
       
   479 // -----------------------------------------------------------------------------
       
   480 // CMceCsSession::ITC
       
   481 // -----------------------------------------------------------------------------
       
   482 //
       
   483 CMceCsServerITC& CMceCsSession::ITC()
       
   484     {
       
   485     return *iITC;
       
   486     }
       
   487 
       
   488 // -----------------------------------------------------------------------------
       
   489 // CMceCsSession::ReceiveL
       
   490 // -----------------------------------------------------------------------------
       
   491 //
       
   492 void CMceCsSession::ReceiveL( TMceIds& aIds, const RMessage2& aMessage )
       
   493 	{
       
   494     MCESRV_DEBUG("CMceCsSession::ReceiveL, Entry");
       
   495 	
       
   496     ReceiverL( aIds )->ReceiveL( aMessage );
       
   497     
       
   498     MCESRV_DEBUG("CMceCsSession::ReceiveL, Exit");
       
   499     }
       
   500 
       
   501 // -----------------------------------------------------------------------------
       
   502 // CMceCsSession::StoreDefaultHeadersL
       
   503 // -----------------------------------------------------------------------------
       
   504 //
       
   505 void CMceCsSession::StoreDefaultHeadersL( const RMessage2& aMessage )
       
   506     {
       
   507     HBufC8* encodedMsg = ITC().ReadLC( aMessage, EMceItcArgContext );
       
   508     User::LeaveIfNull( encodedMsg );
       
   509     
       
   510     TMceComFactory factory;
       
   511     CMceMsgArray<TMceComFactory>* msgArray = 
       
   512         new (ELeave) CMceMsgArray<TMceComFactory>( factory );
       
   513     CleanupStack::PushL( msgArray );
       
   514     msgArray->DecodeL( *encodedMsg );
       
   515     
       
   516     CDesC8Array* methods = static_cast< CMceMsgTextArray* >
       
   517         ( msgArray->iArray[0] )->iArray;
       
   518     CleanupStack::PushL( methods );
       
   519     CDesC8Array* headers = static_cast< CMceMsgTextArray* >
       
   520         ( msgArray->iArray[1] )->iArray;
       
   521     CleanupStack::PushL( headers );
       
   522     
       
   523     iImpl->StoreDefaultHeadersL( *methods, headers );
       
   524     
       
   525     CleanupStack::Pop( headers );
       
   526     CleanupStack::PopAndDestroy( methods );
       
   527     CleanupStack::PopAndDestroy( msgArray );
       
   528     CleanupStack::PopAndDestroy( encodedMsg );
       
   529     }
       
   530 
       
   531 // -----------------------------------------------------------------------------
       
   532 // CMceCsSession::DefaultHeadersL
       
   533 // -----------------------------------------------------------------------------
       
   534 //
       
   535 void CMceCsSession::DefaultHeadersL( const RMessage2& aMessage )		
       
   536     {
       
   537     MCESRV_DEBUG("CMceCsSession::DefaultHeadersL, Entry");
       
   538     
       
   539     HBufC8* method = ITC().ReadLC( aMessage, EMceItcArgContext );
       
   540     
       
   541     HBufC8* headers = iImpl->DefaultHeadersL( *method );
       
   542     CleanupStack::PopAndDestroy( method );
       
   543     CleanupStack::PushL( headers );
       
   544 
       
   545     iITC->WriteL( aMessage, *headers, EMceItcArgContext);
       
   546 
       
   547     CleanupStack::PopAndDestroy( headers );
       
   548 
       
   549     MCESRV_DEBUG("CMceCsSession::DefaultHeadersL, Exit");
       
   550     }
       
   551     
       
   552 //  End of File