phonebookui/Phonebook/App/src/CPbkCallCmd.cpp
changeset 0 e686773b3f54
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/phonebookui/Phonebook/App/src/CPbkCallCmd.cpp	Tue Feb 02 10:12:17 2010 +0200
@@ -0,0 +1,192 @@
+/*
+* Copyright (c) 2002 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: 
+*           Provides phonebook call command object methods.
+*
+*/
+
+
+// INCLUDE FILES
+#include "CPbkCallCmd.h"
+
+#include <CPbkContactItem.h>
+#include <TPbkContactItemField.h>
+#include <CPbkFieldInfo.h>
+#include <Phonebook.hrh>
+#include "CPbkCallTypeSelector.h"
+#include <pbkdebug.h>
+
+#include <coemain.h>
+#include <AiwServiceHandler.h>      // AIW
+#include <AiwCommon.hrh>            // AIW
+
+
+
+/// Unnamed namespace for local definitions
+namespace {
+
+// LOCAL DEBUG CODE
+#ifdef _DEBUG
+enum TPanicCode
+    {
+    EPanicPreCond_SetupDialData = 1
+    };
+
+void Panic(TPanicCode aReason)
+    {
+    _LIT(KPanicText, "CPbkCallCmd");
+    User::Panic(KPanicText,aReason);
+    }
+#endif
+
+}  // namespace
+
+
+// ================= MEMBER FUNCTIONS =======================
+
+// Default constructor
+CPbkCallCmd::CPbkCallCmd(
+	    const CPbkContactItem& aContactItem,
+		const TPbkContactItemField* aSelectedField,
+		const TPbkContactItemField* aFocusedField,
+        const TInt aCommandId,
+        CAiwServiceHandler& aServiceHandler,
+        const CPbkCallTypeSelector& aSelector) :
+			iContact(aContactItem),
+            iSelectedField(aSelectedField),
+            iFocusedField(aFocusedField),
+            iCommandId(aCommandId),
+            iServiceHandler(aServiceHandler),
+            iSelector(aSelector)
+	{
+    PBK_DEBUG_PRINT
+        (PBK_DEBUG_STRING("CPbkCallCmd::CPbkCallCmd(0x%x)"), this);
+    }
+
+// Static constructor
+CPbkCallCmd* CPbkCallCmd::NewL(
+	    const CPbkContactItem& aContactItem,
+		const TPbkContactItemField* aSelectedField,
+		const TPbkContactItemField* aFocusedField,
+        const TInt aCommandId,
+        CAiwServiceHandler& aServiceHandler,
+        const CPbkCallTypeSelector& aSelector)
+    {
+    CPbkCallCmd* self = new(ELeave) CPbkCallCmd(
+        aContactItem,
+        aSelectedField,
+        aFocusedField,
+        aCommandId,
+        aServiceHandler,
+        aSelector);
+    return self;
+    }
+
+// Destructor
+CPbkCallCmd::~CPbkCallCmd()
+    {
+    PBK_DEBUG_PRINT
+        (PBK_DEBUG_STRING("CPbkCallCmd::~CPbkCallCmd(0x%x)"), this);
+    }
+
+void CPbkCallCmd::ExecuteLD()
+    {
+    PBK_DEBUG_PRINT
+        (PBK_DEBUG_STRING("CPbkCallCmd::ExecuteLD(0x%x)"), this);
+
+  	CleanupStack::PushL(this);
+
+    // First setup dial data
+    SetupDialDataL();
+    TAiwDialDataV1Pckg dialDataPckg(iDialData);
+    
+    // Set parameters for the AIW call
+    CAiwGenericParamList& paramList = iServiceHandler.InParamListL();
+    TPtrC8 ptr;
+    ptr.Set(dialDataPckg);
+    TAiwVariant variant(ptr);
+
+    TAiwGenericParam param(EGenericParamCallDialDataV1, variant);
+    paramList.AppendL(param);
+
+    // If the command id is EPbkCmdCall it means the call was launched
+    // with send key and we therefore must use different AIW command
+    // than when the call was selected from the menu
+   if (iCommandId == EPbkCmdCall)
+       {
+        iServiceHandler.ExecuteServiceCmdL(
+            KAiwCmdCall,
+            paramList,
+            iServiceHandler.OutParamListL(), 
+            0,
+            NULL );
+       }
+   else // the call was launched from menu
+       {
+        // Relay the command to AIW for handling
+        iServiceHandler.ExecuteMenuCmdL(
+            iCommandId,
+            paramList,
+            iServiceHandler.OutParamListL(), 
+            0,      // No options used.
+            NULL);  // No need for callback
+       }
+
+	// Destroy itself as promised
+    CleanupStack::PopAndDestroy(); // this
+    }
+
+/**
+ * Sets up aDialData for a call to aContact's aField.
+ */
+inline void CPbkCallCmd::SetupDialDataL()
+    {
+    // Set basic dial data
+    iDialData.SetWindowGroup(CCoeEnv::Static()->RootWin().Identifier());
+    iDialData.SetContactId(iContact.Id());
+    iDialData.SetRemoveInvalidChars(ETrue);
+    if (iFocusedField)
+        {
+        iDialData.SetContactItemField(*iFocusedField);
+        }
+    
+    if (iCommandId == EPbkCmdCall)
+        {
+        __ASSERT_DEBUG(iSelectedField,
+            Panic(EPanicPreCond_SetupDialData));
+
+        // If the call is launched with send key, we have to fill certain
+        // fields by ourselves
+        iDialData.SetNumberType(iSelectedField->FieldInfo().FieldId());
+        TAiwTelephoneNumber phoneNumber(iSelectedField->Text().
+            Left(KAiwTelephoneNumberLength));
+        iDialData.SetTelephoneNumber(phoneNumber);
+        
+        // We also have select call type by ourselves
+        iDialData.SetCallType(TAiwCallType( // the cast is safe
+            iSelector.SelectCallType(
+                iCommandId,
+                iContact,
+                iFocusedField,
+                *iSelectedField)));
+        }
+    }
+        
+void CPbkCallCmd::ProcessFinished(MPbkBackgroundProcess& /*aProcess*/)
+    {
+    PBK_DEBUG_PRINT
+        (PBK_DEBUG_STRING("CPbkCallCmd::ProcessFinished(0x%x)"), this);
+    }
+
+//  End of File