mtpfws/mtpfw/src/cmtpsession.cpp
changeset 49 c20dd21d1eb4
parent 0 d0791faffa3f
equal deleted inserted replaced
41:2c19c7cf5550 49:c20dd21d1eb4
    19 */
    19 */
    20 
    20 
    21 #include <mtp/mtpprotocolconstants.h>
    21 #include <mtp/mtpprotocolconstants.h>
    22 
    22 
    23 #include "cmtpsession.h"
    23 #include "cmtpsession.h"
       
    24 #include "mtpdebug.h"
       
    25 #include "OstTraceDefinitions.h"
       
    26 #ifdef OST_TRACE_COMPILER_IN_USE
       
    27 #include "cmtpsessionTraces.h"
       
    28 #endif
       
    29 
    24 
    30 
    25 // Class constants.
    31 // Class constants.
    26 __FLOG_STMT(_LIT8(KComponent,"Session");)
       
    27 
    32 
    28 #ifdef _DEBUG
    33 #ifdef _DEBUG
    29 
    34 
    30 /**
    35 /**
    31 CMTPSession panics
    36 CMTPSession panics
    65 /**
    70 /**
    66 Destructor.
    71 Destructor.
    67 */ 
    72 */ 
    68 CMTPSession::~CMTPSession()
    73 CMTPSession::~CMTPSession()
    69     {
    74     {
    70     __FLOG(_L8("~CMTPSession - Entry"));
    75     OstTraceFunctionEntry0( CMTPSESSION_CMTPSESSION_DES_ENTRY );
    71     iRoutingRegistrations.Close();
    76     iRoutingRegistrations.Close();
    72     __FLOG(_L8("~CMTPSession - Exit"));
    77     OstTraceFunctionExit0( CMTPSESSION_CMTPSESSION_DES_EXIT );
    73     __FLOG_CLOSE;
       
    74     }
    78     }
    75     
    79     
    76 /**
    80 /**
    77 Provides the next expected TransactionID. Transaction IDs are assigned 
    81 Provides the next expected TransactionID. Transaction IDs are assigned 
    78 in incremental sequence by the MTP initiator in the range 0x00000001 to
    82 in incremental sequence by the MTP initiator in the range 0x00000001 to
    79 0xFFFFFFFE.
    83 0xFFFFFFFE.
    80 @return The next TransactionID expected on the session.
    84 @return The next TransactionID expected on the session.
    81 */
    85 */
    82 TUint32 CMTPSession::ExpectedTransactionId() const
    86 TUint32 CMTPSession::ExpectedTransactionId() const
    83     {
    87     {
    84     __FLOG(_L8("ExpectedTransactionId - Entry"));
    88     OstTraceFunctionEntry0( CMTPSESSION_EXPECTEDTRANSACTIONID_ENTRY );
    85     __FLOG_VA((_L8("iExpectedTransactionId = 0x%08X"), iExpectedTransactionId));
    89     OstTrace1(TRACE_NORMAL, CMTPSESSION_EXPECTEDTRANSACTIONID, 
    86     __FLOG(_L8("ExpectedTransactionId - Exit")); 
    90             "iExpectedTransactionId = 0x%08X", iExpectedTransactionId);
       
    91     OstTraceFunctionExit0( CMTPSESSION_EXPECTEDTRANSACTIONID_EXIT );
    87     return iExpectedTransactionId; 
    92     return iExpectedTransactionId; 
    88     }
    93     }
    89 
    94 
    90 /**
    95 /**
    91 Increments the next expected TransactionID to the next value in the sequence.
    96 Increments the next expected TransactionID to the next value in the sequence.
    92 TransactionIDs are assigned by the MTP initiator starting from 0x00000001. 
    97 TransactionIDs are assigned by the MTP initiator starting from 0x00000001. 
    93 When the TransactionID increments to 0xFFFFFFFF it wraps back to 0x00000001.
    98 When the TransactionID increments to 0xFFFFFFFF it wraps back to 0x00000001.
    94 */
    99 */
    95 void CMTPSession::IncrementExpectedTransactionId()
   100 void CMTPSession::IncrementExpectedTransactionId()
    96     {
   101     {
    97     __FLOG(_L8("IncrementExpectedTransactionId - Entry"));
   102     OstTraceFunctionEntry0( CMTPSESSION_INCREMENTEXPECTEDTRANSACTIONID_ENTRY );
    98     if (++iExpectedTransactionId == KMTPTransactionIdLast)
   103     if (++iExpectedTransactionId == KMTPTransactionIdLast)
    99         {
   104         {
   100         iExpectedTransactionId = KMTPTransactionIdFirst;
   105         iExpectedTransactionId = KMTPTransactionIdFirst;
   101         }
   106         }
   102     __FLOG_VA((_L8("iExpectedTransactionId = 0x%08X"), iExpectedTransactionId));
   107     OstTrace1(TRACE_NORMAL, CMTPSESSION_INCREMENTEXPECTEDTRANSACTIONID, 
   103     __FLOG(_L8("IncrementExpectedTransactionId - Exit"));
   108             "iExpectedTransactionId = 0x%08X", iExpectedTransactionId);    
       
   109     OstTraceFunctionExit0( CMTPSESSION_INCREMENTEXPECTEDTRANSACTIONID_EXIT );
   104     }
   110     }
   105 
   111 
   106 /**
   112 /**
   107 Sets or resets the session's active transaction request dataset. The active 
   113 Sets or resets the session's active transaction request dataset. The active 
   108 transaction request dataset should only be set at the start of the transaction 
   114 transaction request dataset should only be set at the start of the transaction 
   109 (ERequestPhase), and reset and the end of the transaction (ECompletingPhase).
   115 (ERequestPhase), and reset and the end of the transaction (ECompletingPhase).
   110 @param aRequest The active transaction request dataset.
   116 @param aRequest The active transaction request dataset.
   111 */
   117 */
   112 void CMTPSession::SetActiveRequestL(const TMTPTypeRequest& aRequest)
   118 void CMTPSession::SetActiveRequestL(const TMTPTypeRequest& aRequest)
   113     {
   119     {
   114     __FLOG(_L8("SetActiveRequestL - Entry"));
   120     OstTraceFunctionEntry0( CMTPSESSION_SETACTIVEREQUESTL_ENTRY );
   115     MMTPType::CopyL(aRequest, iActiveRequest);    
   121     MMTPType::CopyL(aRequest, iActiveRequest);    
   116     __FLOG(_L8("SetActiveRequestL - Exit"));
   122     OstTraceFunctionExit0( CMTPSESSION_SETACTIVEREQUESTL_EXIT );
   117     }
   123     }
   118 
   124 
   119 /**
   125 /**
   120 Sets the session's transaction phase state variable.
   126 Sets the session's transaction phase state variable.
   121 @param aPhase The new transaction phase state value.
   127 @param aPhase The new transaction phase state value.
   122 */
   128 */
   123 void CMTPSession::SetTransactionPhase(TMTPTransactionPhase aPhase)
   129 void CMTPSession::SetTransactionPhase(TMTPTransactionPhase aPhase)
   124     {
   130     {
   125     __FLOG(_L8("SetTransactionPhase - Entry"));
   131     OstTraceFunctionEntry0( CMTPSESSION_SETTRANSACTIONPHASE_ENTRY );
   126     iTransactionPhase = aPhase;
   132     iTransactionPhase = aPhase;
   127     __FLOG_VA((_L8("iTransactionPhase = 0x%08X"), iTransactionPhase));
   133     OstTrace1(TRACE_NORMAL, CMTPSESSION_SETTRANSACTIONPHASE, 
   128     __FLOG(_L8("SetTransactionPhase - Exit"));
   134             "iTransactionPhase = 0x%08X", iTransactionPhase);        
       
   135     OstTraceFunctionExit0( CMTPSESSION_SETTRANSACTIONPHASE_EXIT );
   129     }
   136     }
   130 
   137 
   131     
   138     
   132 /**
   139 /**
   133 Provides the current MTP transaction state for the session.
   140 Provides the current MTP transaction state for the session.
   134 @return The MTP transaction state for the session.
   141 @return The MTP transaction state for the session.
   135 */
   142 */
   136 TMTPTransactionPhase CMTPSession::TransactionPhase() const
   143 TMTPTransactionPhase CMTPSession::TransactionPhase() const
   137     {
   144     {
   138     __FLOG(_L8("TransactionPhase - Entry"));
   145     OstTraceFunctionEntry0( CMTPSESSION_TRANSACTIONPHASE_ENTRY );
   139     __FLOG_VA((_L8("iTransactionPhase = 0x%08X"), iTransactionPhase));
   146     OstTrace1(TRACE_NORMAL, CMTPSESSION_TRANSACTIONPHASE, 
   140     __FLOG(_L8("TransactionPhase - Exit"));
   147             "iTransactionPhase = 0x%08X", iTransactionPhase);        
       
   148 	OstTraceFunctionExit0( CMTPSESSION_TRANSACTIONPHASE_EXIT );
   141 	return  iTransactionPhase;
   149 	return  iTransactionPhase;
   142     }
   150     }
   143     
   151     
   144 TInt CMTPSession::RouteRequest(const TMTPTypeRequest& aRequest)
   152 TInt CMTPSession::RouteRequest(const TMTPTypeRequest& aRequest)
   145     {
   153     {
   146     __FLOG(_L8("RouteRequest - Entry"));
   154     OstTraceFunctionEntry0( CMTPSESSION_ROUTEREQUEST_ENTRY );
   147     TInt ret(KErrNotFound);
   155     TInt ret(KErrNotFound);
   148     
   156     
   149     // Attempt to match the request to existing registrations.
   157     // Attempt to match the request to existing registrations.
   150     TInt idx(iRoutingRegistrations.FindInOrder(aRequest, CMTPSession::RouteRequestOrder));
   158     TInt idx(iRoutingRegistrations.FindInOrder(aRequest, CMTPSession::RouteRequestOrder));
   151     if (idx != KErrNotFound)
   159     if (idx != KErrNotFound)
   166         */
   174         */
   167         TUint16 op(aRequest.Uint16(TMTPTypeRequest::ERequestOperationCode));
   175         TUint16 op(aRequest.Uint16(TMTPTypeRequest::ERequestOperationCode));
   168         if ((op == EMTPOpCodeSendObject) ||
   176         if ((op == EMTPOpCodeSendObject) ||
   169             (op == EMTPOpCodeTerminateOpenCapture))
   177             (op == EMTPOpCodeTerminateOpenCapture))
   170             {
   178             {
   171             __FLOG_VA((_L8("Unregistering follow-on request 0x%08X"), op));
   179             OstTrace1(TRACE_NORMAL, CMTPSESSION_ROUTEREQUEST, 
       
   180                     "Unregistering follow-on request 0x%08X", op);
   172             iRoutingRegistrations.Remove(idx);
   181             iRoutingRegistrations.Remove(idx);
   173             }
   182             }
   174         }
   183         }
   175         
   184         
   176     __FLOG_VA((_L8("DP ID = %d"), ret));
   185     OstTrace1(TRACE_NORMAL, DUP1_CMTPSESSION_ROUTEREQUEST, 
   177     __FLOG(_L8("RouteRequest - Exit"));
   186             "DP ID = %d", ret);
       
   187     OstTraceFunctionExit0( CMTPSESSION_ROUTEREQUEST_EXIT );
   178     return ret;
   188     return ret;
   179     }
   189     }
   180   
   190   
   181 void CMTPSession::RouteRequestRegisterL(const TMTPTypeRequest& aRequest, TInt aDpId)
   191 void CMTPSession::RouteRequestRegisterL(const TMTPTypeRequest& aRequest, TInt aDpId)
   182     {
   192     {
   183     __FLOG(_L8("RouteRequestRegisterL - Entry"));
   193     OstTraceFunctionEntry0( CMTPSESSION_ROUTEREQUESTREGISTERL_ENTRY );
   184     // Locate any pre-existing registration (which if found, will be overwritten).
   194     // Locate any pre-existing registration (which if found, will be overwritten).
   185     TInt idx(iRoutingRegistrations.FindInOrder(aRequest, CMTPSession::RouteRequestOrder));
   195     TInt idx(iRoutingRegistrations.FindInOrder(aRequest, CMTPSession::RouteRequestOrder));
   186     if (idx == KErrNotFound)
   196     if (idx == KErrNotFound)
   187         {
   197         {
   188         iRoutingRegistrations.InsertInOrderL(aRequest, CMTPSession::RouteRequestOrder);
   198         iRoutingRegistrations.InsertInOrderL(aRequest, CMTPSession::RouteRequestOrder);
   189         User::LeaveIfError(idx = iRoutingRegistrations.FindInOrder(aRequest, CMTPSession::RouteRequestOrder));
   199         LEAVEIFERROR(idx = iRoutingRegistrations.FindInOrder(aRequest, CMTPSession::RouteRequestOrder),
       
   200                 OstTrace1( TRACE_ERROR, CMTPSESSION_ROUTEREQUESTREGISTERL, "can't find in routing registrations for request, dpId %d",  aDpId));
   190         }
   201         }
   191     
   202     
   192     /*
   203     /*
   193     For convenience the DP ID is saved in the registered request, in the 
   204     For convenience the DP ID is saved in the registered request, in the 
   194     TransactionID element (which is unused for routing).
   205     TransactionID element (which is unused for routing).
   195     */
   206     */
   196     iRoutingRegistrations[idx].SetUint32(TMTPTypeRequest::ERequestTransactionID, aDpId);
   207     iRoutingRegistrations[idx].SetUint32(TMTPTypeRequest::ERequestTransactionID, aDpId);
   197     __FLOG(_L8("RouteRequestRegisterL - Exit"));
   208     OstTraceFunctionExit0( CMTPSESSION_ROUTEREQUESTREGISTERL_EXIT );
   198     }
   209     }
   199 
   210 
   200 /**
   211 /**
   201 Indicates if a routing request is registered on the session with the 
   212 Indicates if a routing request is registered on the session with the 
   202 specified MTP operation code.
   213 specified MTP operation code.
   204 @return ETrue if a routing request with the specified MTP operation code is 
   215 @return ETrue if a routing request with the specified MTP operation code is 
   205 registered on the session, otherwise EFalse.
   216 registered on the session, otherwise EFalse.
   206 */
   217 */
   207 TBool CMTPSession::RouteRequestRegistered(TUint16 aOpCode) const
   218 TBool CMTPSession::RouteRequestRegistered(TUint16 aOpCode) const
   208     {
   219     {
   209     __FLOG(_L8("RouteRequestPending - Entry"));
   220     OstTraceFunctionEntry0( CMTPSESSION_ROUTEREQUESTREGISTERED_ENTRY );
   210     __FLOG(_L8("RouteRequestPending - Entry"));
   221     OstTraceFunctionExit0( CMTPSESSION_ROUTEREQUESTREGISTERED_EXIT );
   211     return (iRoutingRegistrations.Find(aOpCode, CMTPSession::RouteRequestMatchOpCode) != KErrNotFound);
   222     return (iRoutingRegistrations.Find(aOpCode, CMTPSession::RouteRequestMatchOpCode) != KErrNotFound);
   212     }
   223     }
   213 
   224 
   214 void CMTPSession::RouteRequestUnregister(const TMTPTypeRequest& aRequest)
   225 void CMTPSession::RouteRequestUnregister(const TMTPTypeRequest& aRequest)
   215     {
   226     {
   216     __FLOG(_L8("RouteRequestUnregister - Entry"));
   227     OstTraceFunctionEntry0( CMTPSESSION_ROUTEREQUESTUNREGISTER_ENTRY );
   217     TInt idx(iRoutingRegistrations.FindInOrder(aRequest, CMTPSession::RouteRequestOrder));
   228     TInt idx(iRoutingRegistrations.FindInOrder(aRequest, CMTPSession::RouteRequestOrder));
   218     if (idx != KErrNotFound)
   229     if (idx != KErrNotFound)
   219         {
   230         {
   220         iRoutingRegistrations.Remove(idx);
   231         iRoutingRegistrations.Remove(idx);
   221         }
   232         }
   222     __FLOG(_L8("RouteRequestUnregister - Exit"));
   233     OstTraceFunctionExit0( CMTPSESSION_ROUTEREQUESTUNREGISTER_EXIT );
   223     }
   234     }
   224     
   235     
   225 void CMTPSession::StorePendingEventL(const TMTPTypeEvent& aEvent)
   236 void CMTPSession::StorePendingEventL(const TMTPTypeEvent& aEvent)
   226     {
   237     {
   227     MMTPType::CopyL(aEvent, iPendingEvent);
   238     MMTPType::CopyL(aEvent, iPendingEvent);
   251 completion code.
   262 completion code.
   252 @param aErr The asynchronous request completion request.
   263 @param aErr The asynchronous request completion request.
   253 */
   264 */
   254 void CMTPSession::CompletePendingRequest(TInt aErr)
   265 void CMTPSession::CompletePendingRequest(TInt aErr)
   255     {
   266     {
   256     __FLOG(_L8("CompletePendingRequest - Entry"));
   267     OstTraceFunctionEntry0( CMTPSESSION_COMPLETEPENDINGREQUEST_ENTRY );
   257     
   268     
   258     if (iRequestStatus != NULL)
   269     if (iRequestStatus != NULL)
   259         {
   270         {
   260         __ASSERT_DEBUG(*iRequestStatus == KRequestPending, Panic(EMTPPanicStraySignal));
   271         __ASSERT_DEBUG(*iRequestStatus == KRequestPending, Panic(EMTPPanicStraySignal));
   261         User::RequestComplete(iRequestStatus, aErr);
   272         User::RequestComplete(iRequestStatus, aErr);
   262         }
   273         }
   263     
   274 
   264     __FLOG(_L8("CompletePendingRequest - Exit"));
   275     OstTraceFunctionExit0( CMTPSESSION_COMPLETEPENDINGREQUEST_EXIT );
   265     }
   276     }
   266     
   277     
   267 
   278 
   268 /**
   279 /**
   269 Indicates if an asynchronous request is currently pending.
   280 Indicates if an asynchronous request is currently pending.
   279 Set the status to complete for the currently pending asynchronous request.
   290 Set the status to complete for the currently pending asynchronous request.
   280 @param aStatus The asynchronous request status to complete.
   291 @param aStatus The asynchronous request status to complete.
   281 */
   292 */
   282 void CMTPSession::SetRequestPending(TRequestStatus& aStatus)
   293 void CMTPSession::SetRequestPending(TRequestStatus& aStatus)
   283     {
   294     {
   284     __FLOG(_L8("SetRequestPending - Entry"));
   295     OstTraceFunctionEntry0( CMTPSESSION_SETREQUESTPENDING_ENTRY );
   285     __ASSERT_DEBUG(!iRequestStatus, Panic(EMTPPanicBusy));
   296     __ASSERT_DEBUG(!iRequestStatus, Panic(EMTPPanicBusy));
   286     iRequestStatus = &aStatus;
   297     iRequestStatus = &aStatus;
   287     *iRequestStatus = KRequestPending;
   298     *iRequestStatus = KRequestPending;
   288     __FLOG(_L8("SetRequestPending - Exit"));
   299     OstTraceFunctionExit0( CMTPSESSION_SETREQUESTPENDING_EXIT );
   289     }
   300     }
   290 
   301 
   291 const TMTPTypeRequest& CMTPSession::ActiveRequestL() const
   302 const TMTPTypeRequest& CMTPSession::ActiveRequestL() const
   292     {
   303     {
   293     __FLOG(_L8("ActiveRequestL - Entry"));
   304     OstTraceFunctionEntry0( CMTPSESSION_ACTIVEREQUESTL_ENTRY );
   294     
   305     
   295     if (iTransactionPhase == EIdlePhase)
   306     if (iTransactionPhase == EIdlePhase)
   296         {
   307         {
       
   308         OstTrace0( TRACE_ERROR, CMTPSESSION_ACTIVEREQUESTL, "transaction in EIdlePhase!" );
   297         User::Leave(KErrNotFound);            
   309         User::Leave(KErrNotFound);            
   298         }
   310         }
   299     
   311     
   300     __FLOG(_L8("ActiveRequestL - Exit"));
   312     OstTraceFunctionExit0( CMTPSESSION_ACTIVEREQUESTL_EXIT );
   301     return iActiveRequest;  
   313     return iActiveRequest;  
   302     }
   314     }
   303 
   315 
   304 TUint32 CMTPSession::SessionMTPId() const
   316 TUint32 CMTPSession::SessionMTPId() const
   305     {
   317     {
   306     __FLOG(_L8("SessionMTPId - Entry"));
   318     OstTraceFunctionEntry0( CMTPSESSION_SESSIONMTPID_ENTRY );
   307     __FLOG_VA( (_L8("Session MTP ID = %d"), iIdMTP) );
   319     OstTrace1(TRACE_NORMAL, CMTPSESSION_SESSIONMTPID, "Session MTP ID = %d", iIdMTP);
   308     __FLOG(_L8("SessionMTPId - Exit"));
   320     OstTraceFunctionExit0( CMTPSESSION_SESSIONMTPID_EXIT );
   309     return iIdMTP;        
   321     return iIdMTP;        
   310     }
   322     }
   311 
   323 
   312 TUint CMTPSession::SessionUniqueId() const
   324 TUint CMTPSession::SessionUniqueId() const
   313     {
   325     {
   314     __FLOG(_L8("SessionUniqueId - Entry"));
   326     OstTraceFunctionEntry0( CMTPSESSION_SESSIONUNIQUEID_ENTRY );
   315     __FLOG(_L8("SessionUniqueId - Exit"));
   327     OstTraceFunctionExit0( CMTPSESSION_SESSIONUNIQUEID_EXIT );
   316     return iIdUnique;        
   328     return iIdUnique;        
   317     }
   329     }
   318     
   330     
   319 TAny* CMTPSession::GetExtendedInterface(TUid /*aInterfaceUid*/)
   331 TAny* CMTPSession::GetExtendedInterface(TUid /*aInterfaceUid*/)
   320     {
   332     {
   321     __FLOG(_L8("GetExtendedInterface - Entry"));
   333     OstTraceFunctionEntry0( CMTPSESSION_GETEXTENDEDINTERFACE_ENTRY );
   322     __FLOG(_L8("GetExtendedInterface - Exit"));
   334     OstTraceFunctionExit0( CMTPSESSION_GETEXTENDEDINTERFACE_EXIT );
   323     return NULL;        
   335     return NULL;        
   324     }
   336     }
   325     
   337     
   326 /**
   338 /**
   327 Constructor.
   339 Constructor.
   335     
   347     
   336     }
   348     }
   337 
   349 
   338 void CMTPSession::ConstructL()
   350 void CMTPSession::ConstructL()
   339     {
   351     {
   340     __FLOG_OPEN(KMTPSubsystem, KComponent);
   352     OstTraceFunctionEntry0( CMTPSESSION_CONSTRUCTL_ENTRY );
   341     __FLOG(_L8("ConstructL - Entry"));
   353     OstTraceFunctionExit0( CMTPSESSION_CONSTRUCTL_EXIT );
   342     __FLOG(_L8("ConstructL - Exit"));
       
   343     }
   354     }
   344     
   355     
   345 TBool CMTPSession::RouteRequestMatchOpCode(const TUint16* aOpCode, const TMTPTypeRequest& aRequest)
   356 TBool CMTPSession::RouteRequestMatchOpCode(const TUint16* aOpCode, const TMTPTypeRequest& aRequest)
   346     {
   357     {
   347     return (aRequest.Uint16(TMTPTypeRequest::ERequestOperationCode) == *aOpCode);
   358     return (aRequest.Uint16(TMTPTypeRequest::ERequestOperationCode) == *aOpCode);