Msrp/MsrpServer/src/CMSRPServerSubSession.cpp
branchMSRP_FrameWork
changeset 25 505ad3f0ce5c
child 58 cdb720e67852
equal deleted inserted replaced
22:f1578314b8da 25:505ad3f0ce5c
       
     1 /*
       
     2 * Copyright (c) 2009-2010 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 * Initial Contributors:
       
     9 * Nokia Corporation - initial contribution.
       
    10 * Contributors:
       
    11 *
       
    12 * Description:
       
    13 * MSRP Implementation
       
    14 *
       
    15 */
       
    16 
       
    17 
       
    18 #include "MSRPCommon.h"
       
    19 #include "MSRPServerCommon.h"
       
    20 #include "CMSRPServerSubSession.h"
       
    21 #include "MMSRPConnectionManager.h"
       
    22 #include "CMSRPServerSession.h"
       
    23 #include "CMSRPMessageBase.h"
       
    24 #include "MMSRPConnection.h"
       
    25 #include "CMSRPMessageHandler.h"
       
    26 #include "CMSRPResponse.h"
       
    27 #include "s32mem.h"
       
    28 #include "CMSRPMessage.h"
       
    29 #include "TStateFactory.h"
       
    30 #include "TStates.h"
       
    31 #include "CMsrpToPathHeader.h"
       
    32 #include "CMSRPFromPathHeader.h"
       
    33 
       
    34 
       
    35 CRMessageContainer::CRMessageContainer()
       
    36     {
       
    37     iStatus = FALSE;
       
    38     }
       
    39 
       
    40 CRMessageContainer::~CRMessageContainer()
       
    41     {
       
    42     
       
    43     }
       
    44 
       
    45 TInt CRMessageContainer::Write(TInt aParam,const TDesC8& aDes,TInt aOffset) const
       
    46     {
       
    47     // Write the data, change status and complete the RMessage.
       
    48     return iMsg.Write(aParam, aDes, aOffset);        
       
    49     }
       
    50 
       
    51 void CRMessageContainer:: ReadL(TInt aParam,TDes8& aDes,TInt aOffset) const
       
    52     {
       
    53     // Write the data, change status and complete the RMessage.
       
    54     return iMsg.ReadL(aParam, aDes, aOffset);        
       
    55     }
       
    56 
       
    57 void CRMessageContainer::Complete(TInt aReason)
       
    58     {
       
    59     iStatus = FALSE;
       
    60     iMsg.Complete(aReason);    
       
    61     }
       
    62 
       
    63 TBool CRMessageContainer::Check()
       
    64     {
       
    65     return iStatus;
       
    66     }
       
    67 
       
    68 TBool CRMessageContainer::set(const RMessage2& aMessage)
       
    69     {    
       
    70     if(FALSE == iStatus)
       
    71         {
       
    72         iMsg = aMessage; // Exclicit copy.
       
    73         iStatus = TRUE;
       
    74         return iStatus;        
       
    75         }
       
    76     else
       
    77         {
       
    78         MSRPLOG("CRMessageContainer::set Error!! Container already full");
       
    79         return FALSE;
       
    80         }    
       
    81     }
       
    82 
       
    83 CMSRPServerSubSession* CMSRPServerSubSession::NewL( CMSRPServerSession& aServerSession, CStateFactory& aStateFactory )
       
    84     {
       
    85     CMSRPServerSubSession* self = 
       
    86         CMSRPServerSubSession::NewLC( aServerSession, aStateFactory );
       
    87 
       
    88     CleanupStack::Pop(self);
       
    89     return self;    
       
    90     }    
       
    91 
       
    92 
       
    93 CMSRPServerSubSession* CMSRPServerSubSession::NewLC( CMSRPServerSession& aServerSession,CStateFactory& aStateFactory )
       
    94     {
       
    95     
       
    96     CMSRPServerSubSession* self =
       
    97                             new (ELeave) CMSRPServerSubSession( aServerSession, aStateFactory );
       
    98     CleanupStack::PushL(self);
       
    99     self->ConstructL();
       
   100     return self;
       
   101     }
       
   102 
       
   103 
       
   104 CMSRPServerSubSession::CMSRPServerSubSession( CMSRPServerSession& aServerSession,CStateFactory& aStateFactory )
       
   105                          : iServerSession(aServerSession), iStateFactory(aStateFactory)
       
   106                                               
       
   107     {
       
   108     }
       
   109 
       
   110 
       
   111 CMSRPServerSubSession::~CMSRPServerSubSession()
       
   112     {
       
   113     MSRPLOG("CMSRPServerSubSession::~CMSRPServerSubSession Entered");
       
   114     
       
   115     iState = NULL;         
       
   116 
       
   117     iOutMsgQ.Destroy();
       
   118     iInCommingMsgQ.Destroy();
       
   119     iPendingSendMsgQ.Destroy();
       
   120     iPendingForDeletionQ.Destroy();
       
   121 
       
   122     QueueLog();
       
   123 
       
   124     if(iCurrentMsgHandler)
       
   125         {
       
   126         delete iCurrentMsgHandler;
       
   127         iCurrentMsgHandler = NULL;
       
   128         }
       
   129     
       
   130     if(iConnection)
       
   131         {
       
   132         iConnection->ReleaseConnection(*this);
       
   133         iConnection = NULL;
       
   134         }
       
   135 
       
   136     if(iLocalSessionID)
       
   137         {
       
   138         delete iLocalSessionID;
       
   139         iLocalSessionID = NULL;
       
   140         }
       
   141 
       
   142     if( iRemoteSessionID )
       
   143         {
       
   144         delete iRemoteSessionID;
       
   145         iRemoteSessionID = NULL;
       
   146         }
       
   147 
       
   148     if( iReceivedResp )
       
   149         {
       
   150         delete iReceivedResp;
       
   151         iReceivedResp = NULL;
       
   152         }
       
   153     if( iReceiveFileMsgHdler )
       
   154         {
       
   155         delete iReceiveFileMsgHdler;
       
   156         iReceiveFileMsgHdler = NULL;
       
   157         }
       
   158 
       
   159     MSRPLOG("CMSRPServerSubSession::~CMSRPServerSubSession Exit");
       
   160     }
       
   161 
       
   162 
       
   163 void CMSRPServerSubSession::ConstructL( )
       
   164     {
       
   165     // Not the place where this should be done!!
       
   166     MSRPLOG("CMSRPServerSubSession::ConstructL");  
       
   167     iState = iStateFactory.getStateL( EIdle );
       
   168     iLocalSessionID = CreateSubSessionIDL();    
       
   169     }
       
   170 
       
   171 
       
   172 HBufC8* CMSRPServerSubSession::CreateSubSessionIDL( )
       
   173     {
       
   174     MSRPLOG("CMSRPServerSubSession::CreateSubSessionIDL");
       
   175     HBufC8 *sessID = HBufC8::NewLC(KMSRPSessIdLength);
       
   176     TInt64 randSeed(Math::Random());
       
   177     TInt rand;
       
   178           
       
   179     /* Append Random bits using two Random strings */
       
   180     rand = Math::Rand(randSeed);
       
   181     (sessID->Des()).AppendNumFixedWidth(rand,EHex,KMSRPSessIdLength/2);
       
   182     rand = Math::Rand(randSeed);
       
   183     (sessID->Des()).AppendNumFixedWidth(rand,EHex,KMSRPSessIdLength/2);
       
   184         
       
   185     CleanupStack::Pop(1);// sessID
       
   186     return sessID;
       
   187     }
       
   188 
       
   189 
       
   190 TBool CMSRPServerSubSession::ProcessEventL( TMSRPFSMEvent aEvent)
       
   191     {
       
   192     // Call the relevant state. Setup Traps for graceful error propagation to the client.
       
   193     MSRPLOG("CMSRPServerSubSession::ProcessEventL() Entered");
       
   194 
       
   195     QueueLog();    
       
   196             
       
   197     iState = iState->EventL(aEvent, this); 
       
   198     
       
   199     MSRPLOG("CMSRPServerSubSession::ProcessEventL() Exit ");
       
   200     return TRUE;
       
   201     }
       
   202 
       
   203 
       
   204 TBool CMSRPServerSubSession::ServiceL( const RMessage2& aMessage )
       
   205     {
       
   206     MSRPLOG("CMSRPServerSubSession::ServiceL()");
       
   207 
       
   208     // Process Client Server functions to FSM Events.
       
   209 
       
   210     // Getting rid of the switch for translation.
       
   211     TMSRPFSMEvent event = (TMSRPFSMEvent) (aMessage.Function() - 2); 
       
   212 
       
   213     // Store the incomming aMessage to form the context of the state machine.
       
   214     iClientMessage = &aMessage;        
       
   215         
       
   216     return ProcessEventL(event);    
       
   217     }
       
   218 
       
   219 
       
   220 MMSRPConnectionManager& CMSRPServerSubSession::ConnectionManager( )
       
   221     {
       
   222     return iServerSession.ConnectionManager();
       
   223     }
       
   224 
       
   225 
       
   226 // Implementation of interfaces from MMSRPConnectionObserver.
       
   227 void CMSRPServerSubSession::ConnectionStateL( TInt /*aNewState*/, TInt /*aStatus*/ )
       
   228     {    
       
   229     ProcessEventL(EConnectionStateChangedEvent);
       
   230     }
       
   231 
       
   232 
       
   233 TBool CMSRPServerSubSession::MessageReceivedL( CMSRPMessageHandler* aMsg )
       
   234     {
       
   235     MSRPLOG("CMSRPServerSubSession::MessageReceivedL - New message received");
       
   236     TBool retVal = FALSE;
       
   237     if(checkMessageForSelfL(aMsg))
       
   238         {           
       
   239         iReceivedMsg = aMsg;
       
   240         ProcessEventL(EMSRPIncomingMessageReceivedEvent);
       
   241         retVal = TRUE;
       
   242         }
       
   243 
       
   244     return retVal;    
       
   245     }
       
   246 
       
   247 
       
   248 void CMSRPServerSubSession::UnclaimedMessageL( CMSRPMessageHandler* aMsg )
       
   249     {
       
   250     MSRPLOG("CMSRPServerSubSession::UnclaimedMessage - Unclaimed message received!!");
       
   251     
       
   252     if( (aMsg->MessageType() == MMSRPIncomingMessage::EMSRPMessage ||
       
   253             aMsg->MessageType() == MMSRPIncomingMessage::EMSRPNotDefined )
       
   254             && EFalse == matchSessionIDL(aMsg->GetIncomingMessage()->ToPathHeader()))
       
   255         {        
       
   256         TBool sendToClient = aMsg->SendResponseL(this, *iConnection, 
       
   257                 CMSRPResponse::ESessionDoesNotExist);          
       
   258         iPendingForDeletionQ.Queue(*aMsg);
       
   259         }
       
   260     else
       
   261         {
       
   262         delete aMsg; 
       
   263         }    
       
   264     }
       
   265 
       
   266 
       
   267 // Implementation of interface from MMSRPMsgObserver.
       
   268 
       
   269 void CMSRPServerSubSession::MessageSendCompleteL()
       
   270     {
       
   271     // Called when a message is fully sent out.
       
   272     ProcessEventL(EMSRPDataSendCompleteEvent);
       
   273     }
       
   274 
       
   275 void CMSRPServerSubSession::MessageResponseSendCompleteL(CMSRPMessageHandler& aMsg)
       
   276     {
       
   277     // Called when a message is fully sent out.
       
   278     // Common event handling.
       
   279     iReceivedResp = &aMsg;
       
   280     if(iFileShare)
       
   281         {        
       
   282         ProcessEventL(EMSRPResponseSendCompleteEvent);
       
   283         }
       
   284         if(iPendingForDeletionQ.explicitRemove(iReceivedResp))
       
   285             {
       
   286             delete iReceivedResp;
       
   287             iReceivedResp = NULL;
       
   288             }
       
   289         
       
   290     }
       
   291 
       
   292 
       
   293 void CMSRPServerSubSession::MessageSendProgressL(TInt aBytesSent, TInt aTotalBytes)
       
   294     {
       
   295     iBytesTransferred = aBytesSent;
       
   296     iTotalBytes = aTotalBytes;
       
   297     ProcessEventL(EMSRPSendProgressEvent);    
       
   298     }
       
   299 
       
   300 
       
   301 void CMSRPServerSubSession::MessageReceiveProgressL(TInt aBytesRecvd, TInt aTotalBytes)
       
   302     {
       
   303     iBytesTransferred = aBytesRecvd;
       
   304     iTotalBytes = aTotalBytes;
       
   305     ProcessEventL(EMSRPReceiveProgressEvent);    
       
   306     }
       
   307 
       
   308 
       
   309 void CMSRPServerSubSession::WriterError()
       
   310     {
       
   311     
       
   312     }
       
   313 
       
   314 
       
   315 // Utility Stuff - Common functions used often by States.
       
   316 void CMSRPServerSubSession::CompleteClient(TInt aReason)
       
   317     {
       
   318     iClientMessage->Complete(aReason);
       
   319     iClientMessage = NULL;
       
   320     }
       
   321 
       
   322 TInt CMSRPServerSubSession::Write(TInt aParam,const TDesC8& aDes)
       
   323     {
       
   324     TInt retVal = iClientMessage->Write(aParam, aDes);  
       
   325     return retVal; 
       
   326     }
       
   327 
       
   328 
       
   329 TBool CMSRPServerSubSession::QueueClientSendRequestsL()
       
   330     {
       
   331     // Generic function to Queue the client send requests message. Would be used by 
       
   332     // many states to add to the pending client requests queue.
       
   333     MSRPLOG("CMSRPServerSubSession::QueueClientSendRequestsL");
       
   334         
       
   335     const RMessage2* aMessage = iClientMessage;
       
   336     iClientMessage = NULL;
       
   337 
       
   338     aMessage->ReadL( 0, iSendMSRPdataPckg);
       
   339 
       
   340     CMSRPMessageHandler *aMessageHandler 
       
   341         = CMSRPMessageHandler::NewL(this,
       
   342             iSendMSRPdataPckg().iExtMessageBuffer); 
       
   343     
       
   344     iPendingSendMsgQ.Queue(*aMessageHandler);    
       
   345     aMessage->Complete( KErrNone );        
       
   346         return TRUE;            
       
   347     }
       
   348 
       
   349 
       
   350 void CMSRPServerSubSession::NotifyFileReceiveResultToClientL(CMSRPMessageHandler */*msgHandler*/)
       
   351     {
       
   352     //TODO
       
   353     MSRPLOG("CMSRPServerSubSession::NotifyFileReceiveResultToClientL enter");
       
   354     iSendResultListenMSRPDataPckg().iStatus = 200;
       
   355     iSendResultListenMSRPDataPckg().iIsProgress = FALSE;
       
   356     iResponseListner.Write(0,iSendResultListenMSRPDataPckg);
       
   357     iResponseListner.Complete( KErrNone );
       
   358     MSRPLOG("CMSRPServerSubSession::NotifyFileReceiveResultToClientL exit");
       
   359     }
       
   360 
       
   361 
       
   362 void CMSRPServerSubSession::NotifyFileSendResultToClientL(CMSRPMessageHandler */*msgHandler*/)
       
   363     {
       
   364     //TODO
       
   365     MSRPLOG("CMSRPServerSubSession::NotifyFileSendResultToClientL enter");
       
   366     iSendResultListenMSRPDataPckg().iStatus = 200;
       
   367     iSendResultListenMSRPDataPckg().iIsProgress = FALSE;
       
   368     iResponseListner.Write(0,iSendResultListenMSRPDataPckg);
       
   369     iResponseListner.Complete( KErrNone );
       
   370     MSRPLOG("CMSRPServerSubSession::NotifyFileSendResultToClientL exit");
       
   371     }
       
   372 
       
   373 
       
   374 TBool CMSRPServerSubSession::SendProgressToClientL(CMSRPMessageHandler */*msgHandler*/)
       
   375     {
       
   376     MSRPLOG("CMSRPServerSubSession::SendProgressToClientL enter");
       
   377     iSendResultListenMSRPDataPckg().iStatus    = KErrNone;
       
   378     iSendResultListenMSRPDataPckg().iIsProgress = TRUE;
       
   379     iSendResultListenMSRPDataPckg().iBytesSent = iBytesTransferred;
       
   380     iSendResultListenMSRPDataPckg().iTotalBytes = iTotalBytes;
       
   381     
       
   382     iResponseListner.Write(0,iSendResultListenMSRPDataPckg);
       
   383     iResponseListner.Complete( KErrNone );
       
   384 
       
   385     MSRPLOG("CMSRPServerSubSession::SendProgressToClientL exit");
       
   386     return TRUE;
       
   387     }
       
   388 
       
   389 
       
   390 TBool CMSRPServerSubSession::ReceiveProgressToClientL(CMSRPMessageHandler */*msgHandler*/)
       
   391     {
       
   392     MSRPLOG("CMSRPServerSubSession::ReceiveProgressToClientL enter");
       
   393     iListenMSRPdataPckg().iStatus    = KErrNone;
       
   394     iListenMSRPdataPckg().iIsProgress = TRUE;
       
   395     iListenMSRPdataPckg().iBytesRecvd = iBytesTransferred;
       
   396     iListenMSRPdataPckg().iTotalBytes = iTotalBytes;
       
   397     
       
   398     iIncommingMessageListner.Write(0,iListenMSRPdataPckg);
       
   399     iIncommingMessageListner.Complete( KErrNone );
       
   400     MSRPLOG("CMSRPServerSubSession::ReceiveProgressToClientL exit");
       
   401     return TRUE;
       
   402     }
       
   403 
       
   404 
       
   405 TBool CMSRPServerSubSession::sendResultToClientL(CMSRPMessageHandler *msgHandler)
       
   406     {
       
   407     MSRPLOG("CMSRPServerSubSession::sendResultToClientL");
       
   408     HBufC8* messageId = NULL;
       
   409     TUint i=0;
       
   410 
       
   411     // Allocates memory.
       
   412     TBool error = msgHandler->GetSendResultL( i, messageId );            
       
   413 
       
   414     iSendResultListenMSRPDataPckg().iIsProgress = FALSE;
       
   415     iSendResultListenMSRPDataPckg().iMessageId = *messageId;
       
   416     iSendResultListenMSRPDataPckg().iStatus    = i;
       
   417     iResponseListner.Write(0,iSendResultListenMSRPDataPckg);
       
   418 
       
   419     delete messageId;
       
   420     iResponseListner.Complete( KErrNone );
       
   421     return error;
       
   422     }
       
   423 
       
   424 
       
   425 TBool CMSRPServerSubSession::sendMsgToClientL(CMSRPMessageHandler *incommingMsgHandler)
       
   426     {
       
   427     // Use the client send result listner to respond.
       
   428     // Extract the data and complete the iIncommingMessageListner.
       
   429     MSRPLOG("CMSRPServerSubSession::sendMsgToClientL");
       
   430     CMSRPMessage* inMsg = incommingMsgHandler->GetIncomingMessage();
       
   431 
       
   432     CBufSeg* buf1 = CBufSeg::NewL( 256 ); // expandsize 256
       
   433     CleanupStack::PushL( buf1 );
       
   434     RBufWriteStream writeStream( *buf1 );
       
   435     CleanupClosePushL( writeStream );
       
   436 
       
   437     inMsg->ExternalizeL( writeStream );
       
   438     writeStream.CommitL();
       
   439 
       
   440     iListenMSRPdataPckg().iIsProgress = FALSE;
       
   441     if ( buf1->Size() > KMaxLengthOfIncomingMessageExt )
       
   442         {
       
   443         // invalid message size
       
   444         iListenMSRPdataPckg().iStatus = KErrArgument;
       
   445         }
       
   446     else
       
   447         {
       
   448         buf1->Read( 0, iListenMSRPdataPckg().iExtMessageBuffer, buf1->Size() );
       
   449             iListenMSRPdataPckg().iStatus = KErrNone;            
       
   450         }
       
   451 
       
   452     CleanupStack::PopAndDestroy(2); // buf1, writestream    
       
   453    
       
   454     iIncommingMessageListner.Write(0,iListenMSRPdataPckg);
       
   455     iIncommingMessageListner.Complete(KErrNone);    
       
   456 
       
   457     return TRUE;
       
   458     }
       
   459 
       
   460 void CMSRPServerSubSession::ReadSendDataPckgL()
       
   461     {
       
   462     iClientMessage->ReadL( 0, iSendMSRPdataPckg);
       
   463     return;
       
   464     }
       
   465 
       
   466 TBool CMSRPServerSubSession::listnerSetupComplete()
       
   467     {
       
   468     if(iIncommingMessageListner.Check() && iResponseListner.Check())
       
   469         return TRUE;
       
   470     
       
   471     return FALSE;        
       
   472     }
       
   473 
       
   474 CMSRPServerSubSession::TQueueType CMSRPServerSubSession::getQToProcess()
       
   475     {
       
   476     // Check the pending incomming message queue and client request queue and
       
   477     // decides which to process.
       
   478     // The longer queue is given a priority. If queues are equal incomming message queue 
       
   479     // is given priority.
       
   480 
       
   481     if(iPendingSendMsgQ.Length() > iInCommingMsgQ.Length())
       
   482         return TClientQueue;
       
   483     else
       
   484         return TInCommingMsgQueue;        
       
   485     }
       
   486 
       
   487 
       
   488 TBool CMSRPServerSubSession::QueuesEmpty()
       
   489     {
       
   490     // Returns TRUE if there are no messages to process.
       
   491     if(iPendingSendMsgQ.isEmpty() && iInCommingMsgQ.isEmpty())
       
   492         return TRUE;
       
   493     else
       
   494         return FALSE;
       
   495     }
       
   496 
       
   497 TBool CMSRPServerSubSession::informConnectionReadyToClient()
       
   498     {
       
   499     // The function informs the Client side that the pending connection request(Connect or Listen)
       
   500     // is now complete. 
       
   501 
       
   502     if(EDownstream == iConnDirection)
       
   503         {
       
   504         // Case of Connect request. 
       
   505         iConnectionListner.Complete(KErrNone);
       
   506         }
       
   507     else
       
   508         {
       
   509         // Case of Listen.
       
   510         iIncommingMessageListner.Complete(KErrNone);        
       
   511         }
       
   512     return TRUE;
       
   513     }
       
   514 
       
   515 void CMSRPServerSubSession::QueueLog()
       
   516     {
       
   517     if(iOutMsgQ.Length() || iInCommingMsgQ.Length() || iPendingSendMsgQ.Length()||
       
   518         iPendingForDeletionQ.Length())
       
   519         {
       
   520         // If any of the Queue is not empty. Log a event.
       
   521         MSRPLOG2("CMSRPServerSubSession::ProcessEventL() Queue iOutMsgQ       %d",
       
   522                     iOutMsgQ.Length());
       
   523         
       
   524         MSRPLOG2("CMSRPServerSubSession::ProcessEventL() Queue iInCommingMsgQ %d",
       
   525                     iInCommingMsgQ.Length());
       
   526         
       
   527         MSRPLOG2("CMSRPServerSubSession::ProcessEventL() Queue iPendingSendMsgQ %d",
       
   528                     iPendingSendMsgQ.Length());
       
   529 
       
   530         MSRPLOG2("CMSRPServerSubSession::ProcessEventL() Queue iPendingForDeletionQ %d",
       
   531                     iPendingForDeletionQ.Length());
       
   532         }
       
   533     else
       
   534         {
       
   535         MSRPLOG("CMSRPServerSubSession::ProcessEventL() Queue All Empty");
       
   536         }        
       
   537     }
       
   538 
       
   539 
       
   540 TBool CMSRPServerSubSession::checkMessageForSelfL(CMSRPMessageHandler *aMsgHandler)
       
   541     {
       
   542     MSRPLOG("CMSRPServerSubSession::checkMessageForSelfL");
       
   543     CMSRPMessageBase *message = aMsgHandler->GetIncomingResponse();
       
   544     if(!message)
       
   545         { 
       
   546         message = aMsgHandler->GetIncomingMessage();
       
   547         }
       
   548     
       
   549     if(!message)
       
   550         return FALSE;
       
   551 
       
   552     // Check if the sessionID in the 'To' path matches the LocalSessionID.
       
   553     if(FALSE == matchSessionIDL(message->ToPathHeader()))
       
   554         return FALSE;
       
   555 
       
   556     // Check if the sessionID in the 'From' path matches the known RemoteSessionID.
       
   557     return matchSessionIDL(message->FromPathHeader(), FALSE);            
       
   558     }
       
   559 
       
   560 
       
   561 TBool CMSRPServerSubSession::matchSessionIDL(const CMSRPHeaderBase *aPathHeader, TBool local)
       
   562     {
       
   563     TBool retVal = FALSE;
       
   564     
       
   565     HBufC8* textValue = aPathHeader->ToTextValueLC();        
       
   566     TPtrC8 receivedSessionID = extractSessionID(*textValue);    
       
   567     
       
   568     if(local && receivedSessionID  == *iLocalSessionID)
       
   569         retVal =  TRUE;
       
   570 
       
   571     
       
   572     if(!local && receivedSessionID == *iRemoteSessionID)
       
   573         retVal =  TRUE;
       
   574 
       
   575     CleanupStack::PopAndDestroy(textValue);
       
   576 
       
   577     return retVal;
       
   578     }
       
   579 
       
   580 
       
   581 TPtrC8 CMSRPServerSubSession::extractSessionID(const TDesC8& aPathBuffer)
       
   582     {
       
   583     // Extracts the sessionId from aPathBuffer and matches it again
       
   584     TInt posEndOfSessionString   = 
       
   585                 aPathBuffer.LocateReverseF(KSemiColonCharacter);
       
   586     TInt posStartOfSessionString = 
       
   587                 aPathBuffer.LocateReverseF(KDividedCharacter) + 1;
       
   588 
       
   589     TPtrC8 receivedSessionId = aPathBuffer.Mid(posStartOfSessionString, \
       
   590         (posEndOfSessionString - posStartOfSessionString));
       
   591 
       
   592     return receivedSessionId;
       
   593     }
       
   594 
       
   595 
       
   596 CStateFactory& CMSRPServerSubSession::StateFactory()
       
   597     {
       
   598     return iStateFactory;
       
   599     }
       
   600