diff -r 000000000000 -r e686773b3f54 phonebookui/Phonebook2/UIServices/src/CPbk2ServerAppConnection.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/phonebookui/Phonebook2/UIServices/src/CPbk2ServerAppConnection.cpp Tue Feb 02 10:12:17 2010 +0200 @@ -0,0 +1,387 @@ +/* +* Copyright (c) 2005-2007 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: Phonebook 2 UI Service server application connection. +* +*/ + + +#include "CPbk2ServerAppConnection.h" + +// Phonebook 2 +#include "MPbk2ConnectionObserver.h" +#include "CPbk2ExitServiceMonitor.h" +#include "CPbk2AcceptServiceMonitor.h" +#include + +// System includes +#include + +// Debugging headers +#include + +// -------------------------------------------------------------------------- +// CPbk2ServerAppConnection::CPbk2ServerAppConnection +// -------------------------------------------------------------------------- +// +CPbk2ServerAppConnection::CPbk2ServerAppConnection + ( MPbk2ConnectionObserver& aObserver ) : + CActive( EPriorityStandard ), + iObserver( aObserver ) + { + PBK2_DEBUG_PRINT( PBK2_DEBUG_STRING( + "CPbk2ServerAppConnection::CPbk2ServerAppConnection()") ); + CActiveScheduler::Add( this ); + } + +// -------------------------------------------------------------------------- +// CPbk2ServerAppConnection::~CPbk2ServerAppConnection +// -------------------------------------------------------------------------- +// +CPbk2ServerAppConnection::~CPbk2ServerAppConnection() + { + PBK2_DEBUG_PRINT( PBK2_DEBUG_STRING( + "CPbk2ServerAppConnection::~CPbk2ServerAppConnection()") ); + Cancel(); + delete iArrayResults; + delete iFieldResults; + DisconnectMonitors(); + DisconnectServerApplication(); + } + +// -------------------------------------------------------------------------- +// CPbk2ServerAppConnection::NewL +// -------------------------------------------------------------------------- +// +CPbk2ServerAppConnection* CPbk2ServerAppConnection::NewL + ( MPbk2ConnectionObserver& aObserver ) + { + CPbk2ServerAppConnection* self = + new ( ELeave ) CPbk2ServerAppConnection( aObserver ); + return self; + } + +// -------------------------------------------------------------------------- +// CPbk2ServerAppConnection::LaunchAssignL +// -------------------------------------------------------------------------- +// +void CPbk2ServerAppConnection::LaunchAssignL + ( HBufC8* aConfigurationPackage, HBufC8* aDataPackage, + HBufC8* aAssignInstructions ) + { + PBK2_DEBUG_PRINT( PBK2_DEBUG_STRING( + "CPbk2ServerAppConnection::LaunchAssignL()") ); + // Need to trap, because consumer freezes if ConnectL function leaves. + // Reason for the freeze is that connection stays open. + TRAPD( error, ConnectL() ); + if ( error == KErrNone ) + { + iPbk2AppService.LaunchAssignL( + iStatus, aConfigurationPackage, aDataPackage, + aAssignInstructions, iCanceled ); + SetActive(); + } + else + { + DisconnectMonitors(); + DisconnectServerApplication(); + User::Leave( error ); + } + } + +// -------------------------------------------------------------------------- +// CPbk2ServerAppConnection::LaunchAttributeAssignL +// -------------------------------------------------------------------------- +// +void CPbk2ServerAppConnection::LaunchAttributeAssignL + ( HBufC8* aConfigurationPackage, + TPbk2AttributeAssignData& aAttributePackage, + HBufC8* aAssignInstructions ) + { + PBK2_DEBUG_PRINT( PBK2_DEBUG_STRING( + "CPbk2ServerAppConnection::LaunchAttributeAssignL()") ); + ConnectL(); + iPbk2AppService.LaunchAttributeAssignL + ( iStatus, aConfigurationPackage, aAttributePackage, + aAssignInstructions, iCanceled ); + SetActive(); + } + +// -------------------------------------------------------------------------- +// CPbk2ServerAppConnection::LaunchAttributeUnassignL +// -------------------------------------------------------------------------- +// +void CPbk2ServerAppConnection::LaunchAttributeUnassignL + ( HBufC8* aConfigurationPackage, + TPbk2AttributeAssignData aAttributePackage, + HBufC8* aAssignInstructions ) + { + PBK2_DEBUG_PRINT( PBK2_DEBUG_STRING( + "CPbk2ServerAppConnection::LaunchAttributeUnassignL()") ); + ConnectL(); + iPbk2AppService.LaunchAttributeUnassignL + ( iStatus, aConfigurationPackage, aAttributePackage, + aAssignInstructions, iCanceled ); + SetActive(); + } + +// -------------------------------------------------------------------------- +// CPbk2ServerAppConnection::CancelAssign +// -------------------------------------------------------------------------- +// +void CPbk2ServerAppConnection::CancelAssign() + { + PBK2_DEBUG_PRINT( PBK2_DEBUG_STRING( + "CPbk2ServerAppConnection::CancelAssign()") ); + if ( iPbk2AppService.Handle() != KNullHandle ) + { + iPbk2AppService.CancelAssign( iCanceled ); + } + } + +// -------------------------------------------------------------------------- +// CPbk2ServerAppConnection::LaunchFetchL +// -------------------------------------------------------------------------- +// +void CPbk2ServerAppConnection::LaunchFetchL + ( HBufC8* aConfigurationPackage, HBufC8* aFetchInstructions ) + { + PBK2_DEBUG_PRINT( PBK2_DEBUG_STRING( + "CPbk2ServerAppConnection::LaunchFetchL()") ); + //AIW Cancel command uses CancelFetch and leaves AO active, + //call here Cancel() to avoid using active AO (E32User-CBase 42) + Cancel(); + // Need to trap, because consumer freezes if ConnectL function leaves. + // Reason for the freeze is that connection stays open. + TRAPD( error, ConnectL() ); + + if ( error == KErrNone ) + { + iPbk2AppService.LaunchFetchL + ( iStatus, aConfigurationPackage, + aFetchInstructions, iCanceled ); + SetActive(); + } + else + { + DisconnectMonitors(); + DisconnectServerApplication(); + User::Leave( error ); + } + } + +// -------------------------------------------------------------------------- +// CPbk2ServerAppConnection::CancelFetch +// -------------------------------------------------------------------------- +// +void CPbk2ServerAppConnection::CancelFetch() + { + PBK2_DEBUG_PRINT( PBK2_DEBUG_STRING( + "CPbk2ServerAppConnection::CancelFetch()") ); + if ( iPbk2AppService.Handle() != KNullHandle ) + { + iPbk2AppService.CancelFetch( iCanceled ); + } + } + +// -------------------------------------------------------------------------- +// CPbk2ServerAppConnection::RunL +// -------------------------------------------------------------------------- +// +void CPbk2ServerAppConnection::RunL() + { + PBK2_DEBUG_PRINT( PBK2_DEBUG_STRING( + "CPbk2ServerAppConnection::RunL(%d)"), iStatus.Int() ); + switch( iStatus.Int() ) + { + case KErrNone: + { + GetResultsL(); + iObserver.OperationCompleteL( *iArrayResults, iExtraResultData, + *iFieldResults ); + DisconnectMonitors(); + DisconnectServerApplication(); + break; + } + case KErrCancel: // FALLTHROUGH + case KErrServerTerminated: + { + iObserver.OperationCanceledL(); + DisconnectMonitors(); + DisconnectServerApplication(); + break; + } + case KErrAbort: + { + // Abort is like completion with KErrCancel, + // expect that we leave the server application alive + // and wait for it to close itself down and send + // HandleServerAppExit notification + iObserver.OperationCanceledL(); + DisconnectMonitors(); + break; + } + default: + { + // Delegate to RunError + User::Leave( iStatus.Int() ); + break; + } + }; + } + +// -------------------------------------------------------------------------- +// CPbk2ServerAppConnection::RunError +// -------------------------------------------------------------------------- +// +TInt CPbk2ServerAppConnection::RunError( TInt aError ) + { + PBK2_DEBUG_PRINT( PBK2_DEBUG_STRING( + "CPbk2ServerAppConnection::RunError(%d)"), aError ); + TRAPD( err, iObserver.OperationErrorL( aError ) ); + DisconnectMonitors(); + DisconnectServerApplication(); + return err; + } + +// -------------------------------------------------------------------------- +// CPbk2ServerAppConnection::DoCancel +// -------------------------------------------------------------------------- +// +void CPbk2ServerAppConnection::DoCancel() + { + PBK2_DEBUG_PRINT( PBK2_DEBUG_STRING( + "CPbk2ServerAppConnection::DoCancel()") ); + // Cancels outstanding notification monitors + if ( iExitServiceMonitor ) + { + iExitServiceMonitor->Cancel(); + } + if ( iAcceptServiceMonitor ) + { + iAcceptServiceMonitor->Cancel(); + } + + // Cancels outstanding operations + CancelAssign(); + CancelFetch(); + } + +// -------------------------------------------------------------------------- +// CPbk2ServerAppConnection::HandleServerAppExit +// -------------------------------------------------------------------------- +// +void CPbk2ServerAppConnection::HandleServerAppExit( TInt aReason ) + { + PBK2_DEBUG_PRINT( PBK2_DEBUG_STRING( + "CPbk2ServerAppConnection::HandleServerAppExit(%d)"), aReason ); + TBool okToExit = EFalse; + + // Query the observer whether it is ok to exit application + // (the consumer process) + TRAPD( err, + okToExit = iObserver.OkToExitL( aReason, EPbk2ExitApplication ) ); + + if ( err != KErrNone ) + { + CCoeEnv::Static()->HandleError( err ); + } + + if (okToExit) + { + MAknServerAppExitObserver::HandleServerAppExit( aReason ); + } + else + { + DisconnectServerApplication(); + } + } + +// -------------------------------------------------------------------------- +// CPbk2ServerAppConnection::ConnectL +// -------------------------------------------------------------------------- +// +void CPbk2ServerAppConnection::ConnectL() + { + if ( iPbk2AppService.Handle() == KNullHandle ) + { + iPbk2AppService.ConnectChainedAppL + ( TUid::Uid( KPbk2ServerAppUID3 ) ); + + delete iExitAppServerMonitor; + iExitAppServerMonitor = NULL; + iExitAppServerMonitor = CApaServerAppExitMonitor::NewL + ( iPbk2AppService, *this, CActive::EPriorityStandard ); + + delete iExitServiceMonitor; + iExitServiceMonitor = NULL; + iExitServiceMonitor = CPbk2ExitServiceMonitor::NewL + ( iPbk2AppService, iObserver ); + + delete iAcceptServiceMonitor; + iAcceptServiceMonitor = NULL; + iAcceptServiceMonitor = CPbk2AcceptServiceMonitor::NewL + ( iPbk2AppService, iObserver ); + } + } + +// -------------------------------------------------------------------------- +// CPbk2ServerAppConnection::GetResultsL +// -------------------------------------------------------------------------- +// +void CPbk2ServerAppConnection::GetResultsL() + { + // Important to delete old results + delete iArrayResults; + iArrayResults = NULL; + delete iFieldResults; + iFieldResults = NULL; + + iExtraResultData = KErrNotSupported; + + // First get the result size + TInt arraySize = 0; + TInt fieldSize = 0; + iPbk2AppService.GetResultSizeL( arraySize, fieldSize ); + iArrayResults = HBufC8::NewL( arraySize ); + iFieldResults = HBufC::NewL( fieldSize ); + + // Then get the results + iPbk2AppService.GetResultsL( *iArrayResults, iExtraResultData, + *iFieldResults ); + } + +// -------------------------------------------------------------------------- +// CPbk2ServerAppConnection::DisconnectMonitors +// -------------------------------------------------------------------------- +// +void CPbk2ServerAppConnection::DisconnectMonitors() + { + delete iExitServiceMonitor; + iExitServiceMonitor = NULL; + delete iAcceptServiceMonitor; + iAcceptServiceMonitor = NULL; + } + +// -------------------------------------------------------------------------- +// CPbk2ServerAppConnection::DisconnectServerApplication +// -------------------------------------------------------------------------- +// +void CPbk2ServerAppConnection::DisconnectServerApplication() + { + delete iExitAppServerMonitor; + iExitAppServerMonitor = NULL; + iPbk2AppService.Close(); + } + +// End of File