accessoryservices/accessoryserver/src/ASYProxy/ASYProxyCommandObserver.cpp
changeset 0 4e1aa6a622a0
child 5 1a73e8f1b64d
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/accessoryservices/accessoryserver/src/ASYProxy/ASYProxyCommandObserver.cpp	Tue Feb 02 00:53:00 2010 +0200
@@ -0,0 +1,537 @@
+/*
+* Copyright (c) 2002-2006 Nokia Corporation and/or its subsidiary(-ies). 
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description:  Handler for NotifyProcessCommands and responses
+*
+*/
+
+
+// INCLUDE FILES
+#include "ASYProxyCommandObserver.h"
+#include "ASYProxyCommsService.h"
+#include "ASYProxyTRRecord.h"
+#include "acc_debug.h"
+#include <e32svr.h>
+#include <s32mem.h>
+#include <accpolobjectcon.h>
+
+// EXTERNAL DATA STRUCTURES
+
+// EXTERNAL FUNCTION PROTOTYPES
+
+// CONSTANTS
+
+// MACROS
+
+// LOCAL CONSTANTS AND MACROS
+
+// MODULE DATA STRUCTURES
+
+// LOCAL FUNCTION PROTOTYPES
+
+// FORWARD DECLARATIONS
+
+// ============================= LOCAL FUNCTIONS ===============================
+
+// ============================ MEMBER FUNCTIONS ===============================
+
+// -----------------------------------------------------------------------------
+// CASYProxyCommandObserver::CASYProxyCommandObserver
+// C++ default constructor can NOT contain any code, that
+// might leave.
+// -----------------------------------------------------------------------------
+//
+CASYProxyCommandObserver::CASYProxyCommandObserver():
+    CActive( CActive::EPriorityStandard ),
+    iObjectBuf( NULL ),
+    iObjectBufPtr( NULL, 0, 0 )
+    {
+    COM_TRACE_( "[AccFW:AsyProxy] CASYProxyCommandObserver::CASYProxyCommandObserver()" );
+
+    CActiveScheduler::Add( this );
+    iAllowResponse = KErrNone;
+
+    COM_TRACE_( "[AccFW:AsyProxy] CASYProxyCommandObserver::CASYProxyCommandObserver" );
+    }
+
+// -----------------------------------------------------------------------------
+// CASYProxyCommandObserver::ConstructL
+// Symbian 2nd phase constructor can leave.
+// -----------------------------------------------------------------------------
+//
+void CASYProxyCommandObserver::ConstructL()
+    {
+    COM_TRACE_( "[AccFW:AsyProxy] CASYProxyCommandObserver::ConstructL()" );
+        
+    COM_TRACE_( "[AccFW:AsyProxy] CASYProxyCommandObserver::ConstructL() - return void" );
+    }
+
+// -----------------------------------------------------------------------------
+// CASYProxyCommandObserver::ConstructL
+// Symbian 2nd phase constructor can leave.
+// -----------------------------------------------------------------------------
+//
+void CASYProxyCommandObserver::ConstructL(
+                               CASYProxyCommsService* aAsyProxyCommsSrvc )
+    {
+    COM_TRACE_1( "[AccFW:AsyProxy] CASYProxyCommandObserver::ConstructL(0x%x)", aAsyProxyCommsSrvc );
+
+    ConstructL();
+
+    iAsyProxyCommsSrvc = aAsyProxyCommsSrvc;
+
+    if ( !iAsyProxyCommsSrvc )
+        {
+        SetActive();
+        iStatus = KRequestPending;
+        }
+
+    COM_TRACE_( "[AccFW:AsyProxy] CASYProxyCommandObserver::ConstructL - return void" );
+    }
+
+// -----------------------------------------------------------------------------
+// CASYProxyCommandObserver::NewL
+// Two-phased constructor.
+// -----------------------------------------------------------------------------
+//
+CASYProxyCommandObserver* CASYProxyCommandObserver::NewL(
+                          CASYProxyCommsService* aAsyProxyCommsSrvc )
+    {
+    COM_TRACE_1( "[AccFW:AsyProxy] CASYProxyCommandObserver::NewL(0x%x)", aAsyProxyCommsSrvc );
+
+    CASYProxyCommandObserver* self = new ( ELeave ) CASYProxyCommandObserver();
+    CleanupStack::PushL( self );
+    self->ConstructL( aAsyProxyCommsSrvc );
+    CleanupStack::Pop( self );
+
+    COM_TRACE_1( "[AccFW:AsyProxy] CASYProxyCommandObserver::NewL - return 0x%x", self );
+
+    return self;
+    }
+
+// -----------------------------------------------------------------------------
+// CASYProxyCommandObserver::NewL
+// Two-phased constructor.
+// -----------------------------------------------------------------------------
+//
+CASYProxyCommandObserver* CASYProxyCommandObserver::NewL()
+    {
+    COM_TRACE_( "[AccFW:AsyProxy] CASYProxyCommandObserver::NewL()" );
+
+    CASYProxyCommandObserver* self = new ( ELeave ) CASYProxyCommandObserver();
+    CleanupStack::PushL( self );
+    self->ConstructL();
+    CleanupStack::Pop( self );
+
+    COM_TRACE_1( "[AccFW:AsyProxy] CASYProxyCommandObserver::NewL - return 0x%x", &self );
+
+    return self;
+    }
+
+// Destructor
+CASYProxyCommandObserver::~CASYProxyCommandObserver()
+    {
+    COM_TRACE_( "[AccFW:AsyProxy] CASYProxyCommandObserver::~CASYProxyCommandObserver()" );
+
+    Cancel();
+    
+    if ( iAsyProxyCommsSrvc && iAsyProxyCommsSrvc->iAsyCmdHndlr )
+        {
+        delete iAsyProxyCommsSrvc->iAsyCmdHndlr;
+        iAsyProxyCommsSrvc->iAsyCmdHndlr = 0;
+        }
+
+    if( iObjectBuf )
+        {
+        delete iObjectBuf;
+        iObjectBuf = NULL;
+        }
+        
+    COM_TRACE_( "[AccFW:AsyProxy] CASYProxyCommandObserver::~CASYProxyCommandObserver" );
+    }
+
+// -----------------------------------------------------------------------------
+// CASYProxyCommandObserver::MarkForFinalDestruction
+// 
+// (other items were commented in a header).
+// -----------------------------------------------------------------------------
+//
+void CASYProxyCommandObserver::MarkForFinalDestruction ()
+    {
+    iInDestructionPhase = ETrue;
+    }
+
+// -----------------------------------------------------------------------------
+// CASYProxyCommandObserver::DoCancel
+// 
+// (other items were commented in a header).
+// -----------------------------------------------------------------------------
+//
+void CASYProxyCommandObserver::DoCancel()
+    {
+    COM_TRACE_( "[AccFW:AsyProxy] CASYProxyCommandObserver::DoCancel()" );
+
+    iAsyProxyCommsSrvc->iAsyComms.CancelNotifyProcessCommand();
+
+    if ( !iInDestructionPhase )
+        {
+        COM_TRACE_( "[AccFW:AsyProxy] Proxy Command Observation is Cancelled while Destruction is not in Progress" );
+    #ifdef _DEBUG
+        TRAPD( errUpdate, iAsyProxyCommsSrvc->UpdateAsyCommsStackL() );
+        TRAPD( errCreate, iAsyProxyCommsSrvc->CreateAsyCommandHandlerL( this ) );
+        
+        COM_TRACE_1( "[AccFW:AsyProxy] CASYProxyCommandObserver::DoCancel - errUpdate == %d", errUpdate );
+        COM_TRACE_1( "[AccFW:AsyProxy] CASYProxyCommandObserver::DoCancel - errCreate == %d", errCreate );
+    #else
+        TRAP_IGNORE( iAsyProxyCommsSrvc->UpdateAsyCommsStackL() );
+        TRAP_IGNORE( iAsyProxyCommsSrvc->CreateAsyCommandHandlerL( this ) );
+    #endif
+        }
+    
+    iAsyProxyCommsSrvc->Destroy( KErrNotFound ); // Transaction Id is not known know
+
+    COM_TRACE_( "[AccFW:AsyProxy] CASYProxyCommandObserver::DoCancel - return void" );
+    }
+
+// -----------------------------------------------------------------------------
+// CASYProxyCommandObserver::IssueRequestL
+// Asynchronously calls NotifyProcessCommand of the client
+// (other items were commented in a header).
+// -----------------------------------------------------------------------------
+//
+void CASYProxyCommandObserver::IssueRequestL()
+    {
+    COM_TRACE_( "[AccFW:AsyProxy] CASYProxyCommandObserver::IssueRequestL()" );
+
+    iObjectBuf = CBufFlat::NewL( KAccSrvObjectBaseStreamBufGranularity );   
+    iObjectBuf->ResizeL( KAccSrvObjectBaseStreamBufMaxSize );
+    iObjectBufPtr.Set( iObjectBuf->Ptr( 0 ) );
+    iAsyProxyCommsSrvc->iAsyComms.NotifyProcessCommand(
+                                  iStatus,
+                                  iAsyProxyTRRecord->iParams,
+                                  iObjectBufPtr );                                  
+    iStatus = KRequestPending;                              
+    SetActive();
+
+    COM_TRACE_( "[AccFW:AsyProxy] CASYProxyCommandObserver::IssueRequestL - return void" );
+    }
+
+// -----------------------------------------------------------------------------
+// CASYProxyCommandObserver::RunL
+// Calls ProcessCommandL of ASYProxy handler
+// (other items were commented in a header).
+// -----------------------------------------------------------------------------
+//
+void CASYProxyCommandObserver::RunL()
+    {
+    COM_TRACE_( "[AccFW:AsyProxy] CASYProxyCommandObserver::RunL()" );
+
+    TInt func( iStatus.Int() );
+
+    COM_TRACE_1( "[AccFW:AsyProxy] CASYProxyCommandObserver::RunL - func == %d", func );
+
+    // NotifyProcessCommand() has been completed with KErrNone
+    if ( func == KErrNone ||
+         func == KErrOverflow ) //KErrOverflow means that iObjectBuf is too small
+        {
+        
+        TInt timeOutTrId( KErrNone );
+        timeOutTrId = iAsyProxyTRRecord->TimeOutTrId();        
+        
+        if( timeOutTrId )
+            {
+            COM_TRACE_1( "[AccFW:AsyProxy] CASYProxyCommandObserver::RunL - timeout transaction id == %d", timeOutTrId );	
+            DoDestroy( timeOutTrId );	            
+            }	        
+        else
+            {
+        	  COM_TRACE_( "[AccFW:AsyProxy] CASYProxyCommandObserver::RunL() - no timeout" );
+            }
+                        
+        // Creates a new CASYProxyCommandObserver objects
+        // Adds it to ASYProxyCommsStack
+        // Launches a new IssueRequest() for just created observer objects
+        iAsyProxyCommsSrvc->UpdateAsyCommsStackL();
+
+        // Create new transaction
+        iAsyProxyCommsSrvc->CreateAsyCommandHandlerL( this );
+
+        if( ECmdGetObjectValue == iAsyProxyTRRecord->CmdId() ||
+            ECmdSetObjectValue == iAsyProxyTRRecord->CmdId() )
+            {            
+            
+            if( func == KErrOverflow )
+                {
+                //buf size was not enough.
+                //Read the new buffer size and get the buffer again
+                API_TRACE_( "[AccFW:AsyProxy] CASYProxyCommandObserver::RunL - 2nd attempt" );
+                RBufReadStream rStrm;
+                (void) rStrm.Open( *iObjectBuf );
+                CleanupClosePushL( rStrm );    
+                TInt newBufferSize( rStrm.ReadInt32L() );
+                CleanupStack::PopAndDestroy( &rStrm );
+
+                iObjectBuf->Reset();
+                iObjectBuf->ResizeL( newBufferSize );
+                TPtr8 ptr( iObjectBuf->Ptr( 0 ) );
+
+                iAsyProxyCommsSrvc->iAsyComms.GetBuffer( ptr );                   
+                }
+            
+	            iAsyProxyCommsSrvc->iAsyCmdHndlr->ProcessCommandL( iAsyProxyTRRecord->CmdId(),
+                                                                   iAsyProxyTRRecord->AsyCmdParams());
+            }
+        else
+            {
+            // These must came from server:
+            //     TProcessCmdId
+            //     TASYCmdParams
+            iAsyProxyCommsSrvc->iAsyCmdHndlr->ProcessCommandL(
+                                         iAsyProxyTRRecord->CmdId(),
+                                         iAsyProxyTRRecord->AsyCmdParams() );
+            }
+        }
+
+    // NotifyProcessCommand() has been completed with KErrCancel
+    else if ( func == KErrCancel )
+        {
+        // Do not care about the transaction id
+        // All transactions will be canceled
+        DoDestroy( KDeleteAllRecords );
+        CActiveScheduler::Stop();
+        }
+
+    // else just do nothing more
+
+    COM_TRACE_( "[AccFW:AsyProxy] CASYProxyCommandObserver::RunL - return void" );
+    }
+
+// -----------------------------------------------------------------------------
+// CASYProxyCommandObserver::RunError
+// Returns KErrNone
+// (other items were commented in a header).
+// -----------------------------------------------------------------------------
+//
+TInt CASYProxyCommandObserver::RunError( TInt aError )
+    {
+    COM_TRACE_1( "[AccFW:AsyProxy] CASYProxyCommandObserver::RunError(%d)", aError );
+
+     // Avoid Panic in CActiveScheduler
+    aError = KErrNone;
+
+    if( iObjectBuf )
+        {
+        delete iObjectBuf;
+        iObjectBuf = NULL;
+        }
+    //
+    // If process command fails, mark the record.
+    //
+    TInt trId = iAsyProxyTRRecord->TrId();
+    DoDestroy( trId );
+    COM_TRACE_( "[AccFW:AsyProxy] CASYProxyCommandObserver::RunError - return KErrNone " );
+
+    return aError;
+    }
+
+// -----------------------------------------------------------------------------
+// CASYProxyCommandObserver::DoProcessResponseL
+// Overloaded method for processing responses of TBool -type.
+// (other items were commented in a header).
+// -----------------------------------------------------------------------------
+//
+void CASYProxyCommandObserver::DoProcessResponseL(
+                               const TAccValueTypeTBool aCmdResponse,
+                               const TInt aErrCode )
+    {
+    COM_TRACE_1( "[AccFW:AsyProxy] CASYProxyCommandObserver::DoProcessResponseL(%d)", aCmdResponse );
+    COM_TRACE_1( "[AccFW:AsyProxy] CASYProxyCommandObserver::DoProcessResponseL(%d)", aErrCode );
+    
+    TInt trId = iAsyProxyTRRecord->TrId();
+    DoDestroy( trId );
+    
+    AllowResponseL();
+    iAsyProxyCommsSrvc->iAsyComms.ProcessResponse(
+                                  trId,
+                                  aCmdResponse,
+                                  aErrCode );
+    
+
+    COM_TRACE_( "[AccFW:AsyProxy] CASYProxyCommandObserver::DoProcessResponseL - return void" );
+    }
+
+// -----------------------------------------------------------------------------
+// CASYProxyCommandObserver::DoProcessResponseL
+// Overloaded method for processing responses of TInt -type.
+// (other items were commented in a header).
+// -----------------------------------------------------------------------------
+//
+void CASYProxyCommandObserver::DoProcessResponseL(
+                               const TAccValueTypeTInt aCmdResponse,
+                               const TInt aErrCode )
+    {
+    COM_TRACE_1( "[AccFW:AsyProxy] CASYProxyCommandObserver::DoProcessResponseL(%d)", aCmdResponse );
+    COM_TRACE_1( "[AccFW:AsyProxy] CASYProxyCommandObserver::DoProcessResponseL(%d)", aErrCode );
+
+    TInt trId = iAsyProxyTRRecord->TrId();
+    DoDestroy( trId );
+    
+    AllowResponseL();
+    iAsyProxyCommsSrvc->iAsyComms.ProcessResponse(
+                                  trId,
+                                  aCmdResponse,
+                                  aErrCode );
+
+
+    COM_TRACE_( "[AccFW:AsyProxy] CASYProxyCommandObserver::DoProcessResponseL - return void" );
+    }
+
+// -----------------------------------------------------------------------------
+// CASYProxyCommandObserver::DoProcessResponseL
+// Overloaded method for processing responses TDesC8 -type.
+// (other items were commented in a header).
+// -----------------------------------------------------------------------------
+//
+void CASYProxyCommandObserver::DoProcessResponseL(
+                               const TDesC8& aCmdResponse,
+                               const TInt aErrCode )
+    {
+    COM_TRACE_1( "[AccFW:AsyProxy] CASYProxyCommandObserver::DoProcessResponseL(%S)", &aCmdResponse );
+    COM_TRACE_1( "[AccFW:AsyProxy] CASYProxyCommandObserver::DoProcessResponseL(%d)", aErrCode );
+
+    TInt trId = iAsyProxyTRRecord->TrId();    
+    DoDestroy( trId );
+    
+    AllowResponseL();
+    iAsyProxyCommsSrvc->iAsyComms.ProcessResponse(
+                                  trId,
+                                  aCmdResponse,
+                                  aErrCode );
+
+
+    COM_TRACE_( "[AccFW:AsyProxy] CASYProxyCommandObserver::DoProcessResponseL - return void" );
+    }
+
+// -----------------------------------------------------------------------------
+// CASYProxyCommandObserver::DoProcessResponseL
+// Overloaded method for processing responses TDesC8 -type.
+// (other items were commented in a header).
+// -----------------------------------------------------------------------------
+//
+void CASYProxyCommandObserver::DoProcessResponseL( const CAccPolObjectCon& aObjectCon, const TInt aErrCode )
+    {
+    COM_TRACE_( "[AccFW:AsyProxy] CASYProxyCommandObserver::DoProcessResponseL()");
+    
+    COM_TRACE_1( "[AccFW:AsyProxy] CASYProxyCommandObserver::DoProcessResponseL(%d)", aErrCode );
+    
+    AllowResponseL();
+    TInt trId = iAsyProxyTRRecord->TrId();
+    DoDestroy( trId );
+
+    //Reset buffer
+    iObjectBuf->Reset();    
+    if ( ECmdGetObjectValue == iAsyProxyTRRecord->CmdId() )	
+        {
+        iObjectBuf->ResizeL( KAccSrvObjectBaseStreamBufMaxSize );
+        //Externalize aValue to aBuf
+        RBufWriteStream wStrm;    
+        (void) wStrm.Open( *iObjectBuf );
+        CleanupClosePushL( wStrm );    
+        aObjectCon.ExternalizeL( wStrm );
+        wStrm.CommitL();         
+        CleanupStack::PopAndDestroy( &wStrm );
+       }
+       else
+       {
+        COM_TRACE_( "[AccFW:AsyProxy] CASYProxyCommandObserver::DoProcessResponseL() - Nothing do to!");
+       }
+    
+    // Release allocated buffer
+    if ( iObjectBuf )
+        {
+        TPtr8 ptr( iObjectBuf->Ptr(0) );   
+        iAsyProxyCommsSrvc->iAsyComms.ProcessResponse( trId, 
+                                                       &ptr,
+                                                       aErrCode ); 
+        delete iObjectBuf;
+    	iObjectBuf = NULL;
+        }
+    else
+        {
+        iAsyProxyCommsSrvc->iAsyComms.ProcessResponse( trId, 
+                                                       NULL,
+                                                       aErrCode ); 
+        }
+
+    COM_TRACE_( "[AccFW:AsyProxy] CASYProxyCommandObserver::DoProcessResponseL - return void" );
+    }
+
+// -----------------------------------------------------------------------------
+// CASYProxyCommandObserver::DoObjectContainerFromProxyL
+// Overloaded method for processing responses TDesC8 -type.
+// (other items were commented in a header).
+// -----------------------------------------------------------------------------
+//
+void CASYProxyCommandObserver::DoObjectContainerFromProxyL( CAccPolObjectCon& aObjectCon ) const
+    {    
+    COM_TRACE_( "[AccFW:AsyProxy] CASYProxyCommandObserver::DoObjectContainerFromProxyL()");	
+    RBufReadStream rStrm;
+	  (void) rStrm.Open( *iObjectBuf );
+	  CleanupClosePushL( rStrm );    
+	  aObjectCon.InternalizeL( rStrm );
+    CleanupStack::PopAndDestroy( &rStrm );	 
+    
+    //
+    //Data is fetched from proxy, reset buffer.
+    //
+    iObjectBuf->Reset();       
+    COM_TRACE_( "[AccFW:AsyProxy] CASYProxyCommandObserver::DoObjectContainerFromProxyL()");
+    }    
+// -----------------------------------------------------------------------------
+// CASYProxyCommandObserver::AllowResponseL
+// Leaves or updates iAllowResponse
+// (other items were commented in a header).
+// -----------------------------------------------------------------------------
+//
+void CASYProxyCommandObserver::AllowResponseL()
+    {
+    User::LeaveIfError( iAllowResponse );
+    iAllowResponse = KErrAbort;
+    }
+
+// -----------------------------------------------------------------------------
+// CASYProxyCommandObserver::DoDestroy
+// Calls Destroy if allowed
+// (other items were commented in a header).
+// -----------------------------------------------------------------------------
+//
+void CASYProxyCommandObserver::DoDestroy( TInt aTrId )
+    {
+    iAsyProxyCommsSrvc->Destroy( aTrId );
+    }
+
+// -----------------------------------------------------------------------------
+// CASYProxyCommandObserver::InitializeRef
+// Initializes the iAsyProxyTRRecord
+// (other items were commented in a header).
+// -----------------------------------------------------------------------------
+//
+void CASYProxyCommandObserver::InitializeRef(
+                               CASYProxyTRRecord* aAsyProxyTRRecord )
+    {
+    iAsyProxyTRRecord = aAsyProxyTRRecord;
+    }
+
+// ========================== OTHER EXPORTED FUNCTIONS =========================
+
+// End of File