phoneengine/PhoneCntFinder/ContactService/src/tphcntaiwserviceobserver.cpp
changeset 0 5f000ab63145
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/phoneengine/PhoneCntFinder/ContactService/src/tphcntaiwserviceobserver.cpp	Mon Jan 18 20:18:27 2010 +0200
@@ -0,0 +1,217 @@
+/*
+* Copyright (c) 2007-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:  Observer for Phonebook AIW services.
+*
+*/
+
+
+#include "tphcntaiwserviceobserver.h"
+#include "mphcntservicerequestparam.h"
+#include "mphcntserviceresult.h"
+
+// Phonebook2 AIW service constants
+const TInt KServiceTermiationAllowed = 0; 
+const TInt KProcessTerminationAllowed = 1;
+
+// Phone Process Uid.
+const TInt KPhoneProcess = 0x100058B3;
+const TBool KDoNotAllowProcessTermination = EFalse;
+const TBool KAllowProcessTermination = ETrue;
+
+// ======== MEMBER FUNCTIONS ========
+
+// ---------------------------------------------------------------------------
+// Constructor
+// ---------------------------------------------------------------------------
+//
+TPhCntAiwServiceObserver::TPhCntAiwServiceObserver(
+    MPhCntAiwServiceCompleteObserver& aObserver) : 
+    iResult( NULL ),
+    iParams( NULL ),
+    iObserver( aObserver ),
+    iAiwServiceShuttingDown( EFalse )
+    {
+    }
+   
+// ---------------------------------------------------------------------------
+// Sets params and result
+// ---------------------------------------------------------------------------
+// 
+void TPhCntAiwServiceObserver::SetRequestAndResult( 
+    MPhCntServiceRequestParam* aParams,
+    MPhCntServiceResult* aResult )
+    {
+    iParams = aParams;
+    iResult = aResult;
+    }
+
+// ---------------------------------------------------------------------------
+// From MAiwNotifyCallback
+// Handles the Phonebooks AIW callbacks.
+// ---------------------------------------------------------------------------
+//
+TInt TPhCntAiwServiceObserver::HandleNotifyL(
+    TInt aCmdId,
+    TInt aEventId,
+    CAiwGenericParamList& aEventParamList,
+    const CAiwGenericParamList& /*aInParamList*/ )
+	{
+	TInt response = KErrNone;
+	if( iResult && iParams )
+	    {
+	    if( aCmdId == iParams->Command() ) 
+	        {
+	        switch( aEventId )
+	            {
+	            // User canceled the service.
+	            case KAiwEventCanceled:
+	                // if AIW service is shutting down (ie user has pressed end key), 
+	                // do not indicate that response has received yet, because
+	                // we still have to wait KAiwEventQueryExit.
+	                if( !iAiwServiceShuttingDown )
+	                    {
+	                    ResponseReceived( KErrCancel );
+	                    }
+	                break;
+	            
+	            // Service provider had an internal error.
+	            case KAiwEventError:
+	                ResponseReceived( ParseErrorCode( aEventParamList ) );
+	                break;
+	                
+	            // Service provider stopped from some reason.
+	            case KAiwEventStopped:
+	                ResponseReceived( KErrGeneral );
+	                break;
+	            
+	            case KAiwEventCompleted:
+	                iResult->ParseResult( aEventParamList );
+	                ResponseReceived( KErrNone );
+	                break;
+	                
+	            // We are not interested to check the client selection.
+	            case KAiwEventOutParamCheck: 
+	                response = ETrue;
+	                break;
+	                
+	                
+	            // QUERY EXIT is three phase operation.
+	            // First time when KAiwEventQueryExit comes, Phonebook AIW service
+	            // provider is asking if service is allowed to be terminated (KServiceTermiationAllowed).
+	            // After that service request is completed with event KAiwEventCanceled.
+	            // Last phase is KAiwEventQueryExit event with query to allow process termination 
+	            // (KProcessTerminationAllowed).
+	            case KAiwEventQueryExit:
+
+	                TInt queryType;
+                    if( !FindFirstTInt32Value( 
+	                        aEventParamList, EGenericParamApplication, queryType ) )
+                        {
+                        if( queryType == KServiceTermiationAllowed )
+                            { 
+                            // AIW service is always allowed to exit. After this
+                            // AIW service provider cancels the outstanding
+                            // request with event KAiwEventCanceled.
+                            response = iAiwServiceShuttingDown = ETrue;
+                            }
+                        else if( queryType == KProcessTerminationAllowed )
+                            {
+                            if ( RunningInPhoneAppProcess() )
+                                {
+                                // Phone app process is not allowed to be 
+                                // terminated.
+                                response = KDoNotAllowProcessTermination;    
+                                }
+                            else
+                                {
+                                response = KAllowProcessTermination;
+                                }                          
+                            ResponseReceived( KErrCancel );
+                            }
+                        }
+                    break;
+	              
+	            // Other events are not handled and we wait for
+	            // next event.
+                default:
+                    break;
+	            }           
+	        }
+	    }
+	    
+	return response;
+	}
+	
+// ---------------------------------------------------------------------------
+// Takes error code from generic param list.
+// ---------------------------------------------------------------------------
+//	
+TInt TPhCntAiwServiceObserver::ParseErrorCode( 
+    const CAiwGenericParamList& aEventParamList )
+    {
+    TInt errorValue = KErrGeneral;
+    FindFirstTInt32Value( aEventParamList, EGenericParamError, errorValue );
+    return errorValue;
+    }
+
+// ---------------------------------------------------------------------------
+// Takes integer value from aEventParamList.
+// ---------------------------------------------------------------------------
+//	    
+TInt TPhCntAiwServiceObserver::FindFirstTInt32Value( 
+    const CAiwGenericParamList& aEventParamList, 
+    TGenericParamId aParameterId,
+    TInt& aValue ) const
+    {
+    TInt err( KErrNotFound );
+    TInt index( 0 );
+    const TAiwGenericParam* param =
+        aEventParamList.FindFirst( index, aParameterId );
+    if ( index != KErrNotFound && param )
+        {
+        aValue = param->Value().AsTInt32();
+        err = KErrNone;
+        }
+    return err;
+    }
+
+// ---------------------------------------------------------------------------
+// Notifies observer.
+// ---------------------------------------------------------------------------
+//
+void TPhCntAiwServiceObserver::ResponseReceived( TInt aError )
+    {
+    iObserver.ServiceRequestComplete( aError );
+    iResult = NULL;
+    iParams = NULL;
+    iAiwServiceShuttingDown = EFalse;
+    }
+    
+// ---------------------------------------------------------------------------
+// Checks if running in phone process. The handling of KAiwEventQueryExit
+// is done differently if running in phone process.
+// ---------------------------------------------------------------------------
+//
+TBool TPhCntAiwServiceObserver::RunningInPhoneAppProcess() const
+    {
+    RProcess currentProcess;
+	TBool phoneProcess( EFalse );
+	TUid processID = currentProcess.Identity();
+	if ( processID.iUid == KPhoneProcess )
+        {
+        phoneProcess = ETrue;    
+        }
+    return phoneProcess;
+    }
+