diff -r 000000000000 -r e686773b3f54 phonebookui/Phonebook2/ServerApplication/src/CPbk2AssignService.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/phonebookui/Phonebook2/ServerApplication/src/CPbk2AssignService.cpp Tue Feb 02 10:12:17 2010 +0200 @@ -0,0 +1,405 @@ +/* +* 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 application server assign service. +* +*/ + + +#include "CPbk2AssignService.h" + +// Phonebook 2 +#include "CPbk2SingleContactDataAssigner.h" +#include "CPbk2MultiContactDataAssigner.h" +#include "CPbk2ContactAttributeAssigner.h" +#include "TPbk2ServerMessageDataRetriever.h" +#include "CPbk2ServerAppAppUi.h" +#include + +// Virtual Phonebook +#include + +// System includes +#include + +using namespace AiwContactAssign; + + +/// Unnamed namespace for local definitions +namespace { + +_LIT(KPanicText, "CPbk2AssignService"); + +enum TPanicCode + { + EInvalidRequest, + EInvalidAssignType + }; + +// RMessage IPC-argument slot order +const TInt KResponseSlot = 0; +const TInt KPackedResultsSlot = 0; +const TInt KExtraResultsSlot = 1; +const TInt KResultSizeSlot = 0; +const TInt KAssignInstructionsSlot = 2; + +const TInt KExitAcceptedSlot = 0; // ok to exit protocol +const TInt KExitCommandIdSlot = 1; // ok to exit protocol +const TInt KCompleteExitCommandIdSlot = 0; // ok to exit protocol + + +// Assign types +enum TAssignType + { + EInvalidType, + ESingleContactDataAssign, + EMultipleContactDataAssign, + EContactAttributeAssign, + }; + +/** + * Retrieves assign type from given message. + * + * @param aMessage Message. + * @return Assign type. + */ +TAssignType AssignTypeL( const RMessage2& aMessage ) + { + TAssignType result = EInvalidType; + + TAiwContactAssignDataBasePckg dataPckg; + aMessage.ReadL( KAssignInstructionsSlot, dataPckg ); + + switch ( TAiwContactAssignDataBase::AssignDataTypeFromBuffer + ( dataPckg ) ) + { + case EAiwSingleContactAssignV1: + { + result = ESingleContactDataAssign; + + // Perform additional check for multiple preselected contacts + TPbk2ServerMessageDataRetriever dataRetriever; + CPbk2ServerAppAppUi& appUi = static_cast + ( *CEikonEnv::Static()->EikAppUi() ); + MVPbkContactLinkArray* preselectedContacts = + dataRetriever.GetPreselectedContactLinksL + ( aMessage, + appUi.ApplicationServices().ContactManager() ); + if ( preselectedContacts && preselectedContacts->Count() > 1 ) + { + // Multiple preselected contacts found, switch to + // multi assign mode + result = EMultipleContactDataAssign; + } + delete preselectedContacts; + break; + } + case EAiwMultipleContactAssignV1: + { + result = EMultipleContactDataAssign; + break; + } + case EAiwContactAttributeAssignV1: + { + result = EContactAttributeAssign; + break; + } + default: + { + aMessage.Panic( KPanicText, EInvalidAssignType ); + break; + } + } + return result; + } + +} /// namespace + + +// -------------------------------------------------------------------------- +// CPbk2AssignService::CPbk2AssignService +// -------------------------------------------------------------------------- +// +CPbk2AssignService::CPbk2AssignService( const RMessage2& aExitMsg ) : + iExitMsg( aExitMsg ) + { + } + +// -------------------------------------------------------------------------- +// CPbk2AssignService::~CPbk2AssignService +// -------------------------------------------------------------------------- +// +CPbk2AssignService::~CPbk2AssignService() + { + if ( !iAssignCompleteMsg.IsNull() ) + { + iAssignCompleteMsg.Complete( KErrServerTerminated ); + } + + delete iUiService; + } + +// -------------------------------------------------------------------------- +// CPbk2AssignService::NewL +// -------------------------------------------------------------------------- +// +CPbk2AssignService* CPbk2AssignService::NewL( const RMessage2& aExitMsg ) + { + CPbk2AssignService* self = + new ( ELeave ) CPbk2AssignService( aExitMsg ); + return self; + } + +// -------------------------------------------------------------------------- +// CPbk2AssignService::LaunchServiceL +// -------------------------------------------------------------------------- +// +void CPbk2AssignService::LaunchServiceL( const RMessage2& aMessage ) + { + if ( ( iAssignCompleteMsg.Handle() != KNullHandle ) && + ( iExitMsg.Handle() == KNullHandle ) ) + { + aMessage.Panic( KPanicText, EInvalidRequest ); + } + + delete iUiService; + iUiService = NULL; + + switch ( AssignTypeL( aMessage ) ) + { + case ESingleContactDataAssign: + { + iUiService = CPbk2SingleContactDataAssigner::NewL + ( aMessage, *this ); + break; + } + case EMultipleContactDataAssign: + { + iUiService = CPbk2MultiContactDataAssigner::NewL + ( aMessage, *this ); + break; + } + case EContactAttributeAssign: + { + iUiService = CPbk2ContactAttributeAssigner::NewL + ( aMessage, *this ); + break; + } + default: + { + aMessage.Panic( KPanicText, EInvalidRequest ); + break; + } + } + + iAssignCompleteMsg = aMessage; + iUiService->LaunchServiceL(); + } + +// -------------------------------------------------------------------------- +// CPbk2AssignService::CancelService +// -------------------------------------------------------------------------- +// +void CPbk2AssignService::CancelService( const RMessage2& aMessage ) + { + // If iAssignCompleteMsg is already completed do nothing + if ( !iAssignCompleteMsg.IsNull() ) + { + iUiService->CancelService(); + } + + aMessage.Complete( KErrNone ); + } + +// -------------------------------------------------------------------------- +// CPbk2AssignService::GetResultsL +// -------------------------------------------------------------------------- +// +void CPbk2AssignService::GetResultsL( const RMessage2& aMessage ) + { + if ( iUiService ) + { + MPbk2UiService::TServiceResults results; + iUiService->ServiceResults(&results); + if ( results.iLinkArray ) + { + HBufC8* packedResults = results.iLinkArray->PackLC(); + TPckg extraData(results.iExtraData); + TRAP_IGNORE( + aMessage.WriteL(KPackedResultsSlot, *packedResults ); + aMessage.WriteL(KExtraResultsSlot, extraData ); + ); + CleanupStack::PopAndDestroy(); // packedResults + } + } + aMessage.Complete( KErrNone ); + } + +// -------------------------------------------------------------------------- +// CPbk2AssignService::GetResultSizeL +// -------------------------------------------------------------------------- +// +void CPbk2AssignService::GetResultSizeL( const RMessage2& aMessage ) + { + if ( iUiService ) + { + MPbk2UiService::TServiceResults results; + iUiService->ServiceResults(&results); + if ( results.iLinkArray ) + { + HBufC8* packedResults = results.iLinkArray->PackLC(); + TPtr8 ptr = packedResults->Des(); + TPckg buffer( ptr.Size() ); + TRAP_IGNORE( aMessage.WriteL( + KResultSizeSlot, buffer ) ); + CleanupStack::PopAndDestroy(); // packedResults + } + } + aMessage.Complete( KErrNone ); + } + +// -------------------------------------------------------------------------- +// CPbk2AssignService::TryExitServiceL +// -------------------------------------------------------------------------- +// +void CPbk2AssignService::TryExitServiceL( const RMessage2& aMessage ) + { + TBool accepted = EFalse; + TPckg acceptedPkg( accepted ); + aMessage.ReadL( KExitAcceptedSlot, acceptedPkg ); + + if ( iUiService && accepted ) + { + TInt exitId = KErrNotFound; + TPckg exitPkg( exitId ); + aMessage.ReadL( KExitCommandIdSlot, exitPkg ); + + iUiService->ExitServiceL( exitId ); + } + + aMessage.Complete( KErrNone ); + } + +// -------------------------------------------------------------------------- +// CPbk2AssignService::TryAcceptServiceL +// -------------------------------------------------------------------------- +// +void CPbk2AssignService::TryAcceptServiceL( const RMessage2& aMessage ) + { + // Accept protocol not supported in assign + aMessage.Complete( KErrNotSupported ); + } + +// -------------------------------------------------------------------------- +// CPbk2AssignService::ServiceComplete +// -------------------------------------------------------------------------- +// +void CPbk2AssignService::ServiceComplete() + { + if ( !iAssignCompleteMsg.IsNull() ) + { + TPckg complete( EFalse ); + TRAP_IGNORE( iAssignCompleteMsg.WriteL( KResponseSlot, complete ) ); + iAssignCompleteMsg.Complete( KErrNone ); + } + } + +// -------------------------------------------------------------------------- +// CPbk2AssignService::ServiceCanceled +// -------------------------------------------------------------------------- +// +void CPbk2AssignService::ServiceCanceled() + { + if ( !iAssignCompleteMsg.IsNull() ) + { + TPckg cancel( ETrue ); + TRAP_IGNORE( iAssignCompleteMsg.WriteL( KResponseSlot, cancel ) ); + iAssignCompleteMsg.Complete( KErrCancel ); + } + } + +// -------------------------------------------------------------------------- +// CPbk2AssignService::ServiceAborted +// -------------------------------------------------------------------------- +// +void CPbk2AssignService::ServiceAborted() + { + if ( !iAssignCompleteMsg.IsNull() ) + { + iAssignCompleteMsg.Complete( KErrAbort ); + + // There is nothing to do if ProcessCommandL leaves. + // Of course it shouldn't leave in practice because it's + // exit command. + TRAP_IGNORE( ExitApplicationL() ); + } + } + +// -------------------------------------------------------------------------- +// CPbk2AssignService::ServiceError +// -------------------------------------------------------------------------- +// +void CPbk2AssignService::ServiceError( TInt aErrorCode ) + { + if ( !iAssignCompleteMsg.IsNull() ) + { + TPckg error( aErrorCode ); + TRAP_IGNORE( iAssignCompleteMsg.WriteL( KResponseSlot, error ) ); + iAssignCompleteMsg.Complete( aErrorCode ); + } + } + +// -------------------------------------------------------------------------- +// CPbk2AssignService::CompleteExitMessage +// -------------------------------------------------------------------------- +// +void CPbk2AssignService::CompleteExitMessage( TInt aExitCommandId ) + { + TPckg exitCommandId( aExitCommandId ); + if ( iUiService && iExitMsg.Handle() != KNullHandle ) + { + TRAP_IGNORE( iExitMsg.WriteL( + KCompleteExitCommandIdSlot, exitCommandId ) ); + iExitMsg.Complete( KErrNone ); + } + } + +// -------------------------------------------------------------------------- +// CPbk2AssignService::CompleteAcceptMsg +// -------------------------------------------------------------------------- +// +void CPbk2AssignService::CompleteAcceptMsg + ( const TDesC8& /*aMarkedEntries*/, const TDesC8& /*aLinkData*/ ) + { + // Not supported in assign + } + +// -------------------------------------------------------------------------- +// CPbk2AssignService::ExitApplicationL +// -------------------------------------------------------------------------- +// +void CPbk2AssignService::ExitApplicationL() + { + // Exit application + CEikonEnv* eikonEnv = CEikonEnv::Static(); + if ( eikonEnv ) + { + CEikAppUi* appUi = eikonEnv->EikAppUi(); + MEikCommandObserver* cmdObs = + static_cast( appUi ); + + cmdObs->ProcessCommandL( EAknCmdExit ); + } + } + +// End of File