accessoryservices/accessoryserver/src/Server/AccSrvASYProxyHandler.cpp
changeset 0 4e1aa6a622a0
child 20 1ddbe54d0645
equal deleted inserted replaced
-1:000000000000 0:4e1aa6a622a0
       
     1 /*
       
     2 * Copyright (c) 2002-2006 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:  ASY Proxy Handler
       
    15 *
       
    16 */
       
    17 
       
    18 
       
    19 
       
    20 // INCLUDE FILES
       
    21 #include "AccSrvASYProxyHandler.h"
       
    22 #include "acc_debug.h"
       
    23 #include "AccSrvConnectionController.h"
       
    24 #include "AccSrvServerModel.h"
       
    25 #include "AccPolAccessoryPolicy.h"
       
    26 
       
    27 // EXTERNAL DATA STRUCTURES
       
    28 
       
    29 // EXTERNAL FUNCTION PROTOTYPES
       
    30 
       
    31 // CONSTANTS
       
    32 const TInt KAccSrvModelTrIdMaxCount = 10000;
       
    33 
       
    34 // MACROS
       
    35 
       
    36 // LOCAL CONSTANTS AND MACROS
       
    37 
       
    38 // MODULE DATA STRUCTURES
       
    39 
       
    40 // LOCAL FUNCTION PROTOTYPES
       
    41 
       
    42 // FORWARD DECLARATIONS
       
    43 
       
    44 // ============================= LOCAL FUNCTIONS ===============================
       
    45 
       
    46 // ============================ MEMBER FUNCTIONS ===============================
       
    47 
       
    48 // -----------------------------------------------------------------------------
       
    49 // CAccSrvASYProxyHandler::CAccSrvASYProxyHandler
       
    50 // -----------------------------------------------------------------------------
       
    51 //
       
    52 CAccSrvASYProxyHandler::CAccSrvASYProxyHandler(
       
    53     CAccSrvConnectionController* aConnectionController ) :
       
    54     iConnectionController( aConnectionController ),
       
    55     iTransactionId( 0 )
       
    56     {
       
    57     COM_TRACE_( "[AccFW:AccServer] CAccSrvASYProxyHandler::CAccSrvASYProxyHandler()" );
       
    58     }
       
    59 
       
    60 // -----------------------------------------------------------------------------
       
    61 // CAccSrvASYProxyHandler::ConstructL
       
    62 // Symbian 2nd phase constructor can leave.
       
    63 // -----------------------------------------------------------------------------
       
    64 //
       
    65 void CAccSrvASYProxyHandler::ConstructL()
       
    66     {
       
    67     COM_TRACE_( "[AccFW:AccServer] CAccSrvASYProxyHandler::ConstructL" );
       
    68 
       
    69     iOngoingTransactions.Reset();
       
    70 
       
    71     COM_TRACE_( "[AccFW:AccServer] CAccSrvASYProxyHandler::ConstructL - return void" );
       
    72     }
       
    73 
       
    74 // -----------------------------------------------------------------------------
       
    75 // CAccSrvASYProxyHandler::NewL
       
    76 // Two-phased constructor.
       
    77 // -----------------------------------------------------------------------------
       
    78 //
       
    79 CAccSrvASYProxyHandler* CAccSrvASYProxyHandler::NewL(
       
    80     CAccSrvConnectionController* aConnectionController )
       
    81     {
       
    82     COM_TRACE_( "[AccFW:AccServer] CAccSrvASYProxyHandler::NewL()" );
       
    83 
       
    84     CAccSrvASYProxyHandler* self = new( ELeave ) CAccSrvASYProxyHandler( aConnectionController );
       
    85 
       
    86     CleanupStack::PushL( self );
       
    87     self->ConstructL();
       
    88     CleanupStack::Pop( self );
       
    89 
       
    90     COM_TRACE_( "[AccFW:AccServer] CAccSrvASYProxyHandler::NewL - return self" );
       
    91     return self;
       
    92     }
       
    93 
       
    94 
       
    95 // Destructor
       
    96 CAccSrvASYProxyHandler::~CAccSrvASYProxyHandler()
       
    97     {
       
    98     COM_TRACE_( "[AccFW:AccServer] CAccSrvASYProxyHandler::~CAccSrvASYProxyHandler()" );
       
    99 
       
   100     iOngoingTransactions.Close();
       
   101 
       
   102     COM_TRACE_( "[AccFW:AccServer] CAccSrvASYProxyHandler::~CAccSrvASYProxyHandler - return" );
       
   103     }
       
   104 
       
   105 // -----------------------------------------------------------------------------
       
   106 // CAccSrvASYProxyHandler::HandleASYCommsL
       
   107 // -----------------------------------------------------------------------------
       
   108 //
       
   109 TInt CAccSrvASYProxyHandler::HandleASYCommsL(
       
   110     TProcessCmdId aCmdId,
       
   111     TASYCommandParamRecord& aASYCommand,
       
   112     TPtr8* aPtrBuf )
       
   113     {
       
   114     COM_TRACE_1( "[AccFW:AccServer] CAccSrvASYProxyHandler::HandleASYCommsL(%d)", aCmdId );
       
   115     TInt trID( 0 );
       
   116 
       
   117     if ( ECmdProcessCommandInit == aCmdId )
       
   118         {
       
   119         //No need to store transaction, only a new transaction ID is generated
       
   120         trID = GenerateNewTransactionID();
       
   121         //Complete outstanding NotifyProcessCommand()
       
   122         iConnectionController->NotificationQueue().CompleteASYCmdL( ENotifyProcessCommand,
       
   123                                                                     aCmdId,
       
   124                                                                     trID,
       
   125                                                                     aASYCommand,
       
   126                                                                     aPtrBuf );
       
   127         }
       
   128     else
       
   129         {
       
   130         trID = StoreTransactionID( aCmdId, aASYCommand, aPtrBuf );
       
   131         }
       
   132 
       
   133     COM_TRACE_1( "[AccFW:AccServer] CAccSrvASYProxyHandler::HandleASYCommsL - return TrID=%d", trID );
       
   134     return trID;
       
   135     }
       
   136 
       
   137 // -----------------------------------------------------------------------------
       
   138 // CAccSrvASYProxyHandler::StoreTransactionID
       
   139 // -----------------------------------------------------------------------------
       
   140 //
       
   141 TInt CAccSrvASYProxyHandler::StoreTransactionID(
       
   142     TProcessCmdId aCmdId,
       
   143     TASYCommandParamRecord& aASYCommand,
       
   144     TPtr8* aPtrBuf )
       
   145     {
       
   146     COM_TRACE_( "[AccFW:AccServer] CAccSrvASYProxyHandler::StoreTransactionID()" );
       
   147 
       
   148     TInt trID( KErrNotFound );
       
   149     TInt count( iOngoingTransactions.Count() );
       
   150     TUint32 nameFromOngoingTransactions;
       
   151     TUint32 nameFromRequest;
       
   152 
       
   153     COM_TRACE_1( "[AccFW:AccServer] CAccSrvASYProxyHandler::StoreTransactionID - current count = %d", count );
       
   154 
       
   155     for ( TInt i( 0 ); i < count; ++i )
       
   156         {
       
   157         iOngoingTransactions.operator[](i).iNameRecord.GetName( nameFromOngoingTransactions );
       
   158         aASYCommand.iNameRecord.GetName( nameFromRequest );
       
   159 
       
   160         if ( nameFromOngoingTransactions == nameFromRequest && 
       
   161              iOngoingTransactions.operator[](i).iCommand == aCmdId && 
       
   162              iOngoingTransactions.operator[](i).iUniqueID == aASYCommand.iGenericID.UniqueID() )
       
   163             {
       
   164             //Same command is under processing in ASY -> use existing trid
       
   165             trID = iOngoingTransactions.operator[](i).iTransactionID;
       
   166             COM_TRACE_1( "[AccFW:AccServer] CAccSrvASYProxyHandler::StoreTransactionID - found trid = %d", trID );
       
   167             break;
       
   168             }
       
   169         else
       
   170             {
       
   171             //keep on searching
       
   172             }
       
   173         }
       
   174 
       
   175     if ( KErrNotFound == trID )
       
   176         {
       
   177         TAccSrvTrIDMatchingRecord trIDRecord;
       
   178         trID = GenerateNewTransactionID();
       
   179         trIDRecord.iUniqueID      = aASYCommand.iGenericID.UniqueID();
       
   180         trIDRecord.iNameRecord    = aASYCommand.iNameRecord;
       
   181         trIDRecord.iCommand       = aASYCommand.iCmdValue;
       
   182         trIDRecord.iTransactionID = trID;
       
   183         iOngoingTransactions.Append( trIDRecord );
       
   184         
       
   185         //Complete outstanding NotifyProcessCommand()
       
   186         TRAP_IGNORE( iConnectionController->NotificationQueue().CompleteASYCmdL( 
       
   187                                                                     ENotifyProcessCommand,
       
   188                                                                     aCmdId,
       
   189                                                                     trID,
       
   190                                                                     aASYCommand,
       
   191                                                                     aPtrBuf ) );
       
   192         }
       
   193     else
       
   194         {
       
   195         //No need to generate a new trid, existing is used.
       
   196         //This means also that ASY is not informed about this command.
       
   197         }
       
   198 
       
   199     COM_TRACE_1( "[AccFW:AccServer] CAccSrvASYProxyHandler::StoreTransactionID - return %d", trID );
       
   200     return trID;
       
   201     }
       
   202 
       
   203 // -----------------------------------------------------------------------------
       
   204 // CAccSrvASYProxyHandler::RemoveTransactionID
       
   205 // -----------------------------------------------------------------------------
       
   206 //
       
   207 void CAccSrvASYProxyHandler::RemoveTransactionID( TInt aTransactionID )
       
   208     {
       
   209     COM_TRACE_1( "[AccFW:AccServer] CAccSrvASYProxyHandler::RemoveTransactionID(%d)", aTransactionID );
       
   210 
       
   211     TInt count( iOngoingTransactions.Count() );
       
   212 
       
   213     COM_TRACE_1( "[AccFW:AccServer] CAccSrvASYProxyHandler::RemoveTransactionID - current count = %d", count );
       
   214 
       
   215     for ( TInt i( 0 ); i < count; ++i )
       
   216         {
       
   217         if ( iOngoingTransactions.operator[]( i ).iTransactionID == aTransactionID )
       
   218             {
       
   219             iOngoingTransactions.Remove( i );
       
   220             COM_TRACE_1( "[AccFW:AccServer] CAccSrvASYProxyHandler::StoreTransactionID - removed index = %d",i );
       
   221             break;
       
   222             }
       
   223         else
       
   224             {
       
   225             // Keep on searching.
       
   226             // Not found is not error situation because
       
   227             // 1) One Transaction can handle several ASY commands i.e. it may be allready removed
       
   228             // 2) ECmdProcessCommandInit is not filtered
       
   229             }
       
   230         }
       
   231 
       
   232     COM_TRACE_( "[AccFW:AccServer] CAccSrvASYProxyHandler::RemoveTransactionID - return void" );
       
   233     }
       
   234 
       
   235 // -----------------------------------------------------------------------------
       
   236 // CAccSrvASYProxyHandler::GenerateNewTransactionID
       
   237 //
       
   238 // Increase id by one until max limit is reached.
       
   239 // -----------------------------------------------------------------------------
       
   240 //
       
   241 TInt CAccSrvASYProxyHandler::GenerateNewTransactionID()
       
   242     {
       
   243     COM_TRACE_( "[AccFW:AccServer] CAccSrvASYProxyHandler::GenerateNewTransactionID()" );
       
   244 
       
   245     if ( iTransactionId <= KAccSrvModelTrIdMaxCount )
       
   246         {
       
   247         iTransactionId++;
       
   248         }
       
   249     else
       
   250         {
       
   251         //Zero is reserved for signalling no Transaction ID situation
       
   252         iTransactionId = 1;
       
   253         }
       
   254 
       
   255     COM_TRACE_1( "[AccFW:AccServer] CAccSrvASYProxyHandler::GenerateNewTransactionID - return 0x%x", iTransactionId );
       
   256 
       
   257     return iTransactionId;
       
   258     }
       
   259 
       
   260 // ========================== OTHER EXPORTED FUNCTIONS =========================
       
   261 
       
   262 // End of File