phoneuis/easydialing/edcontactor/src/edcontactorpopuphandler.cpp
branchRCL_3
changeset 9 8871b09be73b
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/phoneuis/easydialing/edcontactor/src/edcontactorpopuphandler.cpp	Fri Feb 19 22:50:26 2010 +0200
@@ -0,0 +1,296 @@
+/*
+* Copyright (c) 2010 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 <phoneappcommands.hrh>
+
+#include "edcontactorserviceheaders.h"
+
+#include <edcontactor.rsg>
+
+// ================= MEMBER FUNCTIONS =======================
+//
+
+// --------------------------------------------------------------------------
+// CEDContactorPopupHandler::NewL
+// --------------------------------------------------------------------------
+//
+CEDContactorPopupHandler* CEDContactorPopupHandler::NewL()
+    {
+    CEDContactorPopupHandler* self = new (ELeave) CEDContactorPopupHandler();
+    CleanupStack::PushL(self);
+    self->ConstructL();
+    CleanupStack::Pop(self);
+    return self;
+    }
+
+// --------------------------------------------------------------------------
+// CEDContactorPopupHandler::~CEDContactorPopupHandler
+// --------------------------------------------------------------------------
+//
+CEDContactorPopupHandler::~CEDContactorPopupHandler()
+    {
+    LOGSTRING("CEDContactorPopupHandler::~CEDContactorPopupHandler");
+    delete iServiceHandler;
+    delete iSchedulerWait;
+    iCoeEnv.DeleteResourceFile (iResourceOffset);
+    delete iQueryResults;
+    }
+
+// --------------------------------------------------------------------------
+// CEDContactorPopupHandler::LaunchPopupL
+// --------------------------------------------------------------------------
+//
+TDesC& CEDContactorPopupHandler::LaunchPopupL(
+    const TDesC8& aContactLinkArray,
+    TAiwCommAddressSelectType aCommAddressSelectType,
+    TBool aUseDefaults )
+    {
+    LOGSTRING("CEDContactorPopupHandler::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);
+
+    // Waiting for popup selection.
+    // Make this whole operation look synchronous
+    CAknAppUi* appUi = static_cast<CAknAppUi*>( iCoeEnv.AppUi() );
+    appUi->HandleCommandL( EPhoneCmdBlockingDialogLaunched );
+    iSchedulerWait->Start();
+    appUi->HandleCommandL( EPhoneCmdBlockingDialogClosed );
+    
+    User::LeaveIfError(iError);
+
+    LOGSTRING("CEDContactorPopupHandler::LaunchPopupL: Done.");
+
+    return *iQueryResults;
+    }
+
+// --------------------------------------------------------------------------
+// CEDContactorPopupHandler::ClosePopupL
+// --------------------------------------------------------------------------
+//
+void CEDContactorPopupHandler::ClosePopupL()
+    {
+    if ( iSchedulerWait->IsStarted() )
+        {
+        iServiceHandler->ExecuteServiceCmdL( KAiwCmdSelect, 
+                iServiceHandler->InParamListL(),
+                iServiceHandler->OutParamListL(), 
+                KAiwOptCancel, 
+                this );
+        }
+    }
+
+// --------------------------------------------------------------------------
+// CEDContactorPopupHandler::HandleNotifyL
+// --------------------------------------------------------------------------
+//
+TInt CEDContactorPopupHandler::HandleNotifyL(TInt aCmdId, TInt aEventId,
+        CAiwGenericParamList& aEventParamList,
+        const CAiwGenericParamList& /*aInParamList*/)
+    {
+    LOGSTRING("CEDContactorPopupHandler::HandleNotifyL");
+    TInt returnValue = KErrNone;
+
+    if (aCmdId == KAiwCmdSelect)
+        {
+        switch(aEventId)
+            {
+            case KAiwEventCompleted:
+                {
+                LOGSTRING("CEDContactorPopupHandler::HandleNotifyL: KAiwEventCompleted");
+                // Selection done.
+                // Read and store results
+                TRAP(iError, ReadFieldDataL(aEventParamList));
+                }
+                break;
+
+            case KAiwEventCanceled:
+                LOGSTRING("CEDContactorPopupHandler::HandleNotifyL: KAiwEventCanceled");
+                // Selection canceled.
+                iError = KErrCancel;
+                break;
+
+            case KAiwEventError:
+            case KAiwEventStopped:
+                LOGSTRING("CEDContactorPopupHandler::HandleNotifyL: KAiwEventError or KAiwEventStopped");
+                // Error occurred.
+                iError = KErrGeneral;
+                break;
+
+            case KAiwEventQueryExit:
+                iError = KErrAbort;
+                returnValue = EFalse; // Telephony must not be allowed to be closed down
+                break;
+
+            default:
+                LOGSTRING("CEDContactorPopupHandler::HandleNotifyL: Unknown");
+                iError = KErrGeneral;
+                break;
+            }
+        // Stop scheduler if service execution has finished.
+        if ( aEventId != KAiwEventQueryExit )
+            {
+            AsyncStop();
+            }
+        }
+
+    LOGSTRING("CEDContactorPopupHandler::HandleNotifyL: Done.");
+    return returnValue;
+    }
+
+// --------------------------------------------------------------------------
+// CEDContactorPopupHandler::CEDContactorPopupHandler
+// --------------------------------------------------------------------------
+//
+CEDContactorPopupHandler::CEDContactorPopupHandler() :
+    iCoeEnv(*CCoeEnv::Static()),
+    iError(KErrNone)
+    {
+    }
+
+// --------------------------------------------------------------------------
+// CEDContactorPopupHandler::ConstructL
+// --------------------------------------------------------------------------
+//
+void CEDContactorPopupHandler::ConstructL()
+    {
+    LOGSTRING("CEDContactorPopupHandler::ConstructL");
+
+    PrepareResourcesL();
+
+    iServiceHandler = CAiwServiceHandler::NewL();
+    iServiceHandler->AttachL(R_EDCONTACTORSERVICE_CONTACT_SELECTION_INTEREST);
+
+    iSchedulerWait = new (ELeave) CActiveSchedulerWait();
+
+    LOGSTRING("CEDContactorPopupHandler::ConstructL: Done.");
+    }
+
+// --------------------------------------------------------------------------
+// CEDContactorPopupHandler::PrepareResourcesL
+// --------------------------------------------------------------------------
+//
+void CEDContactorPopupHandler::PrepareResourcesL()
+    {
+    LOGSTRING("CEDContactorPopupHandler::PrepareResourcesL");
+
+    // preparing resources for use
+    TFileName fileName;
+    fileName.Append (KEDContactorServiceResourceFileName);
+
+    BaflUtils::NearestLanguageFile (iCoeEnv.FsSession (), fileName);
+    if (ConeUtils::FileExists (fileName))
+        {
+        iResourceOffset = iCoeEnv.AddResourceFileL (fileName);
+        }
+    else // not found from user drive, leave badly.
+        {
+        LOGSTRING("CEDContactorPopupHandler::PrepareResourcesL: Resource file not exists.");
+        User::Leave (KErrGeneral);
+        }
+
+    LOGSTRING("CEDContactorPopupHandler::PrepareResourcesL: Done.");
+    }
+
+// --------------------------------------------------------------------------
+// CEDContactorPopupHandler::ReadFieldDataL
+// --------------------------------------------------------------------------
+//
+void CEDContactorPopupHandler::ReadFieldDataL(
+    CAiwGenericParamList& aEventParamList)
+    {
+    LOGSTRING("CEDContactorPopupHandler::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())
+            {
+            LOGSTRING("CEDContactorPopupHandler::ReadFieldDataL: Failed to get field data!");
+            User::Leave(KErrGeneral);
+            }
+        }
+    else
+        {
+        LOGSTRING("CEDContactorPopupHandler::ReadFieldDataL: Not found!");
+        User::Leave(KErrNotFound);
+        }
+
+    LOGSTRING("CEDContactorPopupHandler::ReadFieldDataL: Done.");
+    }
+
+// --------------------------------------------------------------------------
+// CEDContactorPopupHandler::AsyncStop
+// --------------------------------------------------------------------------
+//
+void CEDContactorPopupHandler::AsyncStop()
+    {
+    LOGSTRING("CEDContactorPopupHandler::AsyncStop");
+
+    if(iSchedulerWait->IsStarted())
+        {
+        iSchedulerWait->AsyncStop();
+        }
+
+    LOGSTRING("CEDContactorPopupHandler::AsyncStop: Done.");
+    }
+
+// End of file