diff -r 000000000000 -r e686773b3f54 phonebookui/Phonebook2/CommandsExtension/src/CPbk2GoToURLCmd.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/phonebookui/Phonebook2/CommandsExtension/src/CPbk2GoToURLCmd.cpp Tue Feb 02 10:12:17 2010 +0200 @@ -0,0 +1,394 @@ +/* +* 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 go to URL command object. +* +*/ + + +#include "CPbk2GoToURLCmd.h" + +// Phonebook 2 +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +// Virtual Phonebook +#include +#include +#include +#include +#include + +// System includes +#include +#include +#include +#include +#include + +/// Unnamed namespace for local definitions +namespace { + +_LIT( KProtocolForURL, "4 " ); // The protocal format + +#ifdef _DEBUG +enum TPanicCode + { + ERunL_InvalidState = 1, + EDoLaunchBrowserL_NullURL, + EResolveUrlL_NullField, + EPanicPreCond_Null_Pointer + }; + +void Panic(TPanicCode aReason) + { + _LIT(KPanicText, "CPbk2GoToURLCmd"); + User::Panic(KPanicText,aReason); + } +#endif // _DEBUG + +} /// namespace + + +// -------------------------------------------------------------------------- +// CPbk2GoToURLCmd::CPbk2GoToURLCmd +// -------------------------------------------------------------------------- +// +CPbk2GoToURLCmd::CPbk2GoToURLCmd( MPbk2ContactUiControl& aUiControl ) : + CActive( EPriorityIdle ), iUiControl( &aUiControl ) + { + CActiveScheduler::Add( this ); + } + +// -------------------------------------------------------------------------- +// CPbk2GoToURLCmd::~CPbk2GoToURLCmd +// -------------------------------------------------------------------------- +// +CPbk2GoToURLCmd::~CPbk2GoToURLCmd() + { + Cancel(); + + delete iURL; + delete iContactLink; + delete iRetrieveOperation; + delete iStoreContact; + delete iBrowserLauncher; + Release( iAppServices ); + } + +// -------------------------------------------------------------------------- +// CPbk2GoToURLCmd::NewL +// -------------------------------------------------------------------------- +// +CPbk2GoToURLCmd* CPbk2GoToURLCmd::NewL + ( MPbk2ContactUiControl& aUiControl ) + { + CPbk2GoToURLCmd* self = new ( ELeave ) CPbk2GoToURLCmd( aUiControl ); + CleanupStack::PushL( self ); + self->ConstructL(); + CleanupStack::Pop( self ); + return self; + } + +// -------------------------------------------------------------------------- +// CPbk2GoToURLCmd::ConstructL +// -------------------------------------------------------------------------- +// +inline void CPbk2GoToURLCmd::ConstructL() + { + iAppServices = CPbk2ApplicationServices::InstanceL(); + + iContactLink = iUiControl->FocusedContactL()->CreateLinkLC(); + CleanupStack::Pop(); // iContactLink + + iFieldPropertyArray = &(iAppServices->FieldProperties()); + iBrowserLauncher = CBrowserLauncher::NewL(); + } + +// -------------------------------------------------------------------------- +// CPbk2GoToURLCmd::DoCancel +// -------------------------------------------------------------------------- +// +void CPbk2GoToURLCmd::DoCancel() + { + iBrowserLauncher->Cancel(); + } + +// -------------------------------------------------------------------------- +// CPbk2GoToURLCmd::RunL +// -------------------------------------------------------------------------- +// +void CPbk2GoToURLCmd::RunL() + { + switch (iState) + { + case ERetrieving: + { + RetrieveContactL( *iContactLink ); + break; + } + + case EResolveURL: + { + ResolveUrlL(); + break; + } + + case EStarting: + { + DoLaunchBrowserL(); + break; + } + + case ELaunching: + { + // Do nothing + break; + } + + case EStopping: + { + ProcessDismissed(KErrNone); + break; + } + + default: + { + __ASSERT_DEBUG(EFalse, Panic(ERunL_InvalidState)); + break; + } + } + } + +// -------------------------------------------------------------------------- +// CPbk2GoToURLCmd::RunError +// -------------------------------------------------------------------------- +// +TInt CPbk2GoToURLCmd::RunError( TInt aError ) + { + return aError; + } + +// -------------------------------------------------------------------------- +// CPbk2GoToURLCmd::ExecuteLD +// -------------------------------------------------------------------------- +// +void CPbk2GoToURLCmd::ExecuteLD() + { + iState = ERetrieving; + IssueRequest(); + } + +// -------------------------------------------------------------------------- +// CPbk2GoToURLCmd::AddObserver +// -------------------------------------------------------------------------- +// +void CPbk2GoToURLCmd::AddObserver( MPbk2CommandObserver& aObserver ) + { + this->iCommandObserver = &aObserver; + } + +// -------------------------------------------------------------------------- +// CPbk2GoToURLCmd::ResetUiControl +// -------------------------------------------------------------------------- +// +void CPbk2GoToURLCmd::ResetUiControl( MPbk2ContactUiControl& aUiControl ) + { + if (iUiControl == &aUiControl) + { + iUiControl = NULL; + } + } + +// -------------------------------------------------------------------------- +// CPbk2GoToURLCmd::ProcessDismissed +// -------------------------------------------------------------------------- +// +void CPbk2GoToURLCmd::ProcessDismissed( TInt /*aCancelCode*/ ) + { + __ASSERT_DEBUG(iCommandObserver, Panic(EPanicPreCond_Null_Pointer)); + + if (iUiControl) + { + iUiControl->UpdateAfterCommandExecution(); + } + + // Notify command owner that the command has finished + iCommandObserver->CommandFinished(*this); + } + +// -------------------------------------------------------------------------- +// CPbk2GoToURLCmd::VPbkSingleContactOperationComplete +// Called when retrieve operation completes. +// -------------------------------------------------------------------------- +// +void CPbk2GoToURLCmd::VPbkSingleContactOperationComplete + ( MVPbkContactOperationBase& aOperation, + MVPbkStoreContact* aContact ) + { + if (&aOperation == iRetrieveOperation) + { + delete iRetrieveOperation; + iRetrieveOperation = NULL; + + // We now have a store contact + iStoreContact = aContact; + iState = EResolveURL; + IssueRequest(); + } + } + +// -------------------------------------------------------------------------- +// CPbk2GoToURLCmd::VPbkSingleContactOperationFailed +// Called when retrieve operation fails. +// -------------------------------------------------------------------------- +// +void CPbk2GoToURLCmd::VPbkSingleContactOperationFailed + ( MVPbkContactOperationBase& aOperation, TInt aError ) + { + if (&aOperation == iRetrieveOperation) + { + delete iRetrieveOperation; + iRetrieveOperation = NULL; + + // We cannot get the contact, so we have to + // fail. We cannot continue, since this operation + // was executed only in case of one contact. + ProcessDismissed(aError); + } + } + +// -------------------------------------------------------------------------- +// CPbk2GoToURLCmd::HandleServerAppExit +// -------------------------------------------------------------------------- +// +void CPbk2GoToURLCmd::HandleServerAppExit( TInt /*aReason*/ ) + { + IssueStopRequest(); + } + +// -------------------------------------------------------------------------- +// CPbk2GoToURLCmd::RetrieveContactL +// -------------------------------------------------------------------------- +// +void CPbk2GoToURLCmd::RetrieveContactL + ( const MVPbkContactLink& aContactLink ) + { + // Retrieve the actual store contact from the given link + iRetrieveOperation = iAppServices-> + ContactManager().RetrieveContactL( aContactLink, *this ); + } + +// -------------------------------------------------------------------------- +// CPbk2GoToURLCmd::DoLaunchBrowserL +// -------------------------------------------------------------------------- +// +void CPbk2GoToURLCmd::DoLaunchBrowserL() + { + __ASSERT_DEBUG(iURL,Panic(EDoLaunchBrowserL_NullURL)); + + iBrowserLauncher->LaunchBrowserEmbeddedL + ( *iURL, NULL, this ); + + iState = ELaunching; + IssueRequest(); + } + +// -------------------------------------------------------------------------- +// CPbk2GoToURLCmd::ResolveUrlL +// -------------------------------------------------------------------------- +// +void CPbk2GoToURLCmd::ResolveUrlL() + { + TResourceReader resReader; + CCoeEnv::Static()->CreateResourceReaderLC + (resReader, R_PBK2_URL_ADDRESS_SELECT); + + TPbk2AddressSelectParams params( + *iStoreContact, + iAppServices->ContactManager(), + iAppServices->NameFormatter(), + *iFieldPropertyArray, + resReader); + + CPbk2AddressSelect* addressSelect = CPbk2AddressSelect::NewL(params); + MVPbkStoreContactField* selectedField = addressSelect->ExecuteLD(); + + CleanupStack::PopAndDestroy(); // resReader + + // No field selected. Stop command process. + if (!selectedField) + { + IssueStopRequest(); + } + else + { + CleanupDeletePushL(selectedField); + SetURLFromFieldL(*selectedField); + CleanupStack::PopAndDestroy(); // selectedField + + iState = EStarting; + IssueRequest(); + } + } + +// -------------------------------------------------------------------------- +// CPbk2GoToURLCmd::SetURLFromFieldL +// -------------------------------------------------------------------------- +// +void CPbk2GoToURLCmd::SetURLFromFieldL( MVPbkStoreContactField& aField ) + { + TPtrC url = MVPbkContactFieldTextData::Cast(aField.FieldData()).Text(); + delete iURL; + iURL = NULL; + // For explanation of the protocal format + // refer to Browser API documentation + iURL = HBufC::NewL(KProtocolForURL().Length() + url.Length()); + TPtr urlPtr = iURL->Des(); + urlPtr.Append(KProtocolForURL); + urlPtr.Append(url); + } + +// -------------------------------------------------------------------------- +// CPbk2GoToURLCmd::IssueRequest +// -------------------------------------------------------------------------- +// +void CPbk2GoToURLCmd::IssueRequest() + { + TRequestStatus* status = &iStatus; + User::RequestComplete( status, KErrNone ); + SetActive(); + } + +// -------------------------------------------------------------------------- +// CPbk2GoToURLCmd::IssueStopRequest +// -------------------------------------------------------------------------- +// +void CPbk2GoToURLCmd::IssueStopRequest() + { + iState = EStopping; + if (!IsActive()) + { + IssueRequest(); + } + } + +// End of File