phonebookui/Phonebook2/ccapplication/ccacontactorservice/src/ccacontactorpopuphandler.cpp
changeset 0 e686773b3f54
child 17 2666d9724c76
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/phonebookui/Phonebook2/ccapplication/ccacontactorservice/src/ccacontactorpopuphandler.cpp	Tue Feb 02 10:12:17 2010 +0200
@@ -0,0 +1,313 @@
+/*
+* Copyright (c) 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:  Class for handling popup query.
+ *
+*/
+
+
+#include <e32std.h>
+#include <s32mem.h>
+#include <aknappui.h>
+#include <coemain.h> 
+
+#include "ccacontactorserviceheaders.h"
+
+// ================= MEMBER FUNCTIONS =======================
+//
+
+// --------------------------------------------------------------------------
+// CCCAContactorPopupHandler::NewL
+// --------------------------------------------------------------------------
+//
+CCCAContactorPopupHandler* CCCAContactorPopupHandler::NewL()
+    {
+    CCCAContactorPopupHandler* self = new (ELeave) CCCAContactorPopupHandler();
+    CleanupStack::PushL(self);
+    self->ConstructL();
+    CleanupStack::Pop(self);
+    return self;
+    }
+
+// --------------------------------------------------------------------------
+// CCCAContactorPopupHandler::~CCCAContactorPopupHandler
+// --------------------------------------------------------------------------
+//
+CCCAContactorPopupHandler::~CCCAContactorPopupHandler()
+    {
+    CCA_DP(KCCAContactorServiceLoggerFile, CCA_L("CCCAContactorPopupHandler::~CCCAContactorPopupHandler"));
+    delete iServiceHandler;
+    delete iSchedulerWait;
+    iCoeEnv.DeleteResourceFile (iResourceOffset);
+    delete iQueryResults;
+    }
+
+// --------------------------------------------------------------------------
+// CCCAContactorPopupHandler::LaunchPopupL
+// --------------------------------------------------------------------------
+//
+TDesC& CCCAContactorPopupHandler::LaunchPopupL(
+    const TDesC8& aContactLinkArray,
+    TAiwCommAddressSelectType aCommAddressSelectType,
+    TBool aUseDefaults )
+    {
+    CCA_DP(KCCAContactorServiceLoggerFile, CCA_L("CCCAContactorPopupHandler::LaunchPopupL"));
+
+    __ASSERT_ALWAYS (NULL != &aContactLinkArray, User::Leave (KErrArgument));
+    __ASSERT_ALWAYS (0 < aContactLinkArray.Size(), User::Leave (KErrArgument));
+
+    TUint fetchFlags = 0;
+
+    // Stop scheduler just in case this is called while operation is still ongoing.
+    AsyncStop();
+    
+    // Set service data
+    TAiwSingleItemSelectionDataV3 data;
+
+    if (!aUseDefaults)
+        {
+        fetchFlags |= ::EDoNotUseDefaultField;
+        }
+
+    data.SetFlags(fetchFlags);
+    data.SetCommAddressSelectType(aCommAddressSelectType);
+    CAiwGenericParamList& inParamList = iServiceHandler->InParamListL();
+    inParamList.AppendL(TAiwGenericParam(EGenericParamContactSelectionData,
+        TAiwVariant(TAiwSingleItemSelectionDataV3Pckg(data))));
+
+    // Set contactlink
+    inParamList.AppendL(TAiwGenericParam(EGenericParamContactLinkArray,
+        TAiwVariant(aContactLinkArray)));
+
+    iServiceHandler->ExecuteServiceCmdL(KAiwCmdSelect, inParamList,
+        iServiceHandler->OutParamListL(), 0, this);
+
+    CAknInputBlock* inputBlock = CAknInputBlock::NewCancelHandlerLC( this );
+    iCloseApp = EFalse;
+    
+    // Waiting for popup selection.
+    // Make this whole operation look synchronous
+    iSchedulerWait->Start();
+    
+    CleanupStack::PopAndDestroy( inputBlock );
+    
+    // If error case occurred, leave
+    if (KErrNone != iError)
+        {
+        if (iCloseApp)
+            {
+            // Send an exit command in order to close CCA and Phonebook2
+            // once the end(red) key is pressed or Exit command 
+            CAknAppUi* appUi = static_cast<CAknAppUi*>( iCoeEnv.AppUi() );
+
+            if ( appUi )
+                {
+                appUi->ProcessCommandL( EAknCmdExit );
+                }
+            }
+        User::Leave(iError);
+        }
+
+    CCA_DP(KCCAContactorServiceLoggerFile, CCA_L("CCCAContactorPopupHandler::LaunchPopupL: Done."));
+
+    return *iQueryResults;
+    }
+
+// --------------------------------------------------------------------------
+// CCCAContactorPopupHandler::HandleNotifyL
+// --------------------------------------------------------------------------
+//
+TInt CCCAContactorPopupHandler::HandleNotifyL(TInt aCmdId, TInt aEventId,
+        CAiwGenericParamList& aEventParamList,
+        const CAiwGenericParamList& /*aInParamList*/)
+    {
+    CCA_DP(KCCAContactorServiceLoggerFile, CCA_L("CCCAContactorPopupHandler::HandleNotifyL"));
+    TInt returnValue = KErrNone;
+
+    if (aCmdId == KAiwCmdSelect)
+        {
+        switch(aEventId)
+            {
+            case KAiwEventCompleted:
+                {
+                CCA_DP(KCCAContactorServiceLoggerFile, CCA_L("CCCAContactorPopupHandler::HandleNotifyL: KAiwEventCompleted"));
+                // Selection done.
+                // Read and store results
+                TRAP(iError, ReadFieldDataL(aEventParamList));
+                }
+                break;
+
+            case KAiwEventCanceled:
+                CCA_DP(KCCAContactorServiceLoggerFile, CCA_L("CCCAContactorPopupHandler::HandleNotifyL: KAiwEventCanceled"));
+                // Selection canceled.
+                iError = KErrCancel;
+                break;
+
+            case KAiwEventError:
+            case KAiwEventStopped:
+                CCA_DP(KCCAContactorServiceLoggerFile, CCA_L("CCCAContactorPopupHandler::HandleNotifyL: KAiwEventError or KAiwEventStopped"));
+                // Error occurred.
+                iError = KErrGeneral;
+                break;
+
+            case KAiwEventQueryExit:
+                // TODO: how should this work?
+                iError = KErrAbort;
+                iCloseApp = ETrue;
+                returnValue = ETrue;
+                break;
+
+            default:
+                CCA_DP(KCCAContactorServiceLoggerFile, CCA_L("CCCAContactorPopupHandler::HandleNotifyL: Unknown"));
+                iError = KErrGeneral;
+                break;
+            }
+        // if notify received, stop scheduler
+        AsyncStop();
+        }
+
+    CCA_DP(KCCAContactorServiceLoggerFile, CCA_L("CCCAContactorPopupHandler::HandleNotifyL: Done."));
+    return returnValue;
+    }
+
+// --------------------------------------------------------------------------
+// CCCAContactorPopupHandler::CCCAContactorPopupHandler
+// --------------------------------------------------------------------------
+//
+CCCAContactorPopupHandler::CCCAContactorPopupHandler() :
+    iCoeEnv(*CCoeEnv::Static()),
+    iError(KErrNone)
+    {
+    }
+
+// --------------------------------------------------------------------------
+// CCCAContactorPopupHandler::ConstructL
+// --------------------------------------------------------------------------
+//
+void CCCAContactorPopupHandler::ConstructL()
+    {
+    CCA_DP(KCCAContactorServiceLoggerFile, CCA_L("CCCAContactorPopupHandler::ConstructL"));
+
+    PrepareResourcesL();
+
+    iServiceHandler = CAiwServiceHandler::NewL();
+    iServiceHandler->AttachL(R_CCACONTACTORSERVICE_CONTACT_SELECTION_INTEREST);
+
+    iSchedulerWait = new (ELeave) CActiveSchedulerWait();
+
+    CCA_DP(KCCAContactorServiceLoggerFile, CCA_L("CCCAContactorPopupHandler::ConstructL: Done."));
+    }
+
+// --------------------------------------------------------------------------
+// CCCAContactorPopupHandler::PrepareResourcesL
+// --------------------------------------------------------------------------
+//
+void CCCAContactorPopupHandler::PrepareResourcesL()
+    {
+    CCA_DP(KCCAContactorServiceLoggerFile, CCA_L("CCCAContactorPopupHandler::PrepareResourcesL"));
+
+    // preparing resources for use
+    TFileName fileName;
+    fileName.Append (KCCAContactorServiceResourceFileName);
+
+    BaflUtils::NearestLanguageFile (iCoeEnv.FsSession (), fileName);
+    if (ConeUtils::FileExists (fileName))
+        {
+        iResourceOffset = iCoeEnv.AddResourceFileL (fileName);
+        }
+    else // not found from user drive, leave badly.
+        {
+        CCA_DP(KCCAContactorServiceLoggerFile, CCA_L("CCCAContactorPopupHandler::PrepareResourcesL: Resource file not exists."));
+        User::Leave (KErrGeneral);
+        }
+
+    CCA_DP(KCCAContactorServiceLoggerFile, CCA_L("CCCAContactorPopupHandler::PrepareResourcesL: Done."));
+    }
+
+// --------------------------------------------------------------------------
+// CCCAContactorPopupHandler::ReadFieldDataL
+// --------------------------------------------------------------------------
+//
+void CCCAContactorPopupHandler::ReadFieldDataL(
+    CAiwGenericParamList& aEventParamList)
+    {
+    CCA_DP(KCCAContactorServiceLoggerFile, CCA_L("CCCAContactorPopupHandler::ReadFieldDataL"));
+
+    if (iQueryResults)
+        {
+        delete iQueryResults;
+        iQueryResults = NULL;
+        }
+
+    TInt index = 1; // Get field data from index 1
+    const TAiwGenericParam* param =
+         aEventParamList.FindFirst(index, EGenericParamContactFieldData);
+    if (KErrNotFound != index)
+        {
+        TInt length = param->Value().AsDes().Length();
+        iQueryResults = HBufC::NewL(length);
+        iQueryResults->Des().Append(param->Value().AsDes());
+
+        // Data must be found!
+        if (0 >= iQueryResults->Length())
+            {
+            CCA_DP(KCCAContactorServiceLoggerFile, CCA_L("CCCAContactorPopupHandler::ReadFieldDataL: Failed to get field data!"));
+            User::Leave(KErrGeneral);
+            }
+        }
+    else
+        {
+        CCA_DP(KCCAContactorServiceLoggerFile, CCA_L("CCCAContactorPopupHandler::ReadFieldDataL: Not found!"));
+        User::Leave(KErrNotFound);
+        }
+
+    CCA_DP(KCCAContactorServiceLoggerFile, CCA_L("CCCAContactorPopupHandler::ReadFieldDataL: Done."));
+    }
+
+// --------------------------------------------------------------------------
+// CCCAContactorPopupHandler::AsyncStop
+// --------------------------------------------------------------------------
+//
+void CCCAContactorPopupHandler::AsyncStop()
+    {
+    CCA_DP(KCCAContactorServiceLoggerFile, CCA_L("CCCAContactorPopupHandler::AsyncStop"));
+
+    if(iSchedulerWait->IsStarted())
+        {
+        iSchedulerWait->AsyncStop();
+        }
+
+    CCA_DP(KCCAContactorServiceLoggerFile, CCA_L("CCCAContactorPopupHandler::AsyncStop: Done."));
+    }
+
+// --------------------------------------------------------------------------
+// CCCAContactorPopupHandler::AknInputBlockCancel
+// --------------------------------------------------------------------------
+//
+void CCCAContactorPopupHandler::AknInputBlockCancel()
+    {
+    if ( iSchedulerWait->IsStarted() )
+        {
+        TRAPD( error, iServiceHandler->ExecuteServiceCmdL( KAiwCmdSelect, 
+                                                           iServiceHandler->InParamListL(), 
+                                                           iServiceHandler->OutParamListL(),
+                                                           KAiwOptCancel,
+                                                           this ) );
+        if ( error == KErrNone )
+            {
+            iCloseApp = ETrue;
+            }
+        }
+    }
+
+// End of file