phonebookui/Phonebook2/CommandsExtension/src/CPbk2GoToURLCmd.cpp
branchRCL_3
changeset 63 f4a778e096c2
child 64 c1e8ba0c2b16
child 68 9da50d567e3c
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/phonebookui/Phonebook2/CommandsExtension/src/CPbk2GoToURLCmd.cpp	Wed Sep 01 12:29:52 2010 +0100
@@ -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 <Pbk2ProcessDecoratorFactory.h>
+#include <MPbk2CommandObserver.h>
+#include <MPbk2ContactUiControl.h>
+#include <MPbk2ContactNameFormatter.h>
+#include <TPbk2AddressSelectParams.h>
+#include <CPbk2AddressSelect.h>
+#include <CPbk2ApplicationServices.h>
+#include <MPbk2AppUi.h>
+#include <Pbk2UIControls.rsg>
+#include <CPbk2FieldPropertyArray.h>
+
+// Virtual Phonebook
+#include <CVPbkContactManager.h>
+#include <MVPbkContactOperationBase.h>
+#include <MVPbkStoreContact.h>
+#include <MVPbkContactLink.h>
+#include <MVPbkContactFieldTextData.h>
+
+// System includes
+#include <browserlauncher.h>
+#include <coemain.h>
+#include <barsread.h>
+#include <StringLoader.h>
+#include <aknnotewrappers.h>
+
+/// 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