phonebookui/Phonebook2/ServerApplication/src/CPbk2AppService.cpp
changeset 0 e686773b3f54
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/phonebookui/Phonebook2/ServerApplication/src/CPbk2AppService.cpp	Tue Feb 02 10:12:17 2010 +0200
@@ -0,0 +1,393 @@
+/*
+* 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 application server service class.
+*
+*/
+
+
+#include "CPbk2AppService.h"
+
+// Phonebook 2
+#include "CPbk2AssignService.h"
+#include "CPbk2FetchService.h"
+#include <Pbk2ServerAppIPC.h>
+
+// Debug
+#include <Pbk2Debug.h>
+
+// --------------------------------------------------------------------------
+// CPbk2AppService::CPbk2AppService
+// --------------------------------------------------------------------------
+//
+CPbk2AppService::CPbk2AppService()
+    {
+    PBK2_DEBUG_PRINT( PBK2_DEBUG_STRING
+        ("CPbk2AppService::CPbk2AppService()") );
+    }
+
+// --------------------------------------------------------------------------
+// CPbk2AppService::~CPbk2AppService
+// --------------------------------------------------------------------------
+//
+CPbk2AppService::~CPbk2AppService()
+    {
+    PBK2_DEBUG_PRINT( PBK2_DEBUG_STRING
+        ("CPbk2AppService::~CPbk2AppService()") );
+    if ( !iAcceptMsg.IsNull() )
+        {
+        iAcceptMsg.Complete( KErrServerTerminated );
+        }
+
+    if ( !iExitMsg.IsNull() )
+        {
+        iExitMsg.Complete( KErrServerTerminated );
+        }
+
+    delete iFetchService;
+    delete iAssignService;
+    }
+
+// --------------------------------------------------------------------------
+// CPbk2AppService::NewL
+// --------------------------------------------------------------------------
+//
+CPbk2AppService* CPbk2AppService::NewL()
+    {
+    CPbk2AppService* self = new ( ELeave ) CPbk2AppService;
+    return self;
+    }
+
+// --------------------------------------------------------------------------
+// CPbk2AppService::ServiceL
+// --------------------------------------------------------------------------
+//
+void CPbk2AppService::ServiceL( const RMessage2& aMessage )
+    {
+    TInt functionId = aMessage.Function();
+    PBK2_DEBUG_PRINT( PBK2_DEBUG_STRING
+        ("CPbk2AppService::ServiceL(%d)"), functionId );
+    switch ( functionId )
+        {
+        case EPbk2LaunchFetch:
+            {
+            // Launch fetch service
+            delete iFetchService;
+            iFetchService = NULL;
+            iFetchService = CPbk2FetchService::NewL( iExitMsg, iAcceptMsg );
+            iFetchService->LaunchServiceL( aMessage );
+            break;
+            }
+
+        case EPbk2CancelFetch:
+            {
+            // Synchronous service
+            // Cancel fetch service
+            if ( iFetchService )
+                {
+                iFetchService->CancelService( aMessage );
+                }
+            // Complete message if it is not completed by service
+            if ( !aMessage.IsNull() )
+                {                
+                aMessage.Complete( KErrNone );
+                }
+            break;
+            }
+
+        case EPbk2LaunchAssign:             // FALLTHROUGH
+        case EPbk2LaunchAttributeAssign:    // FALLTHROUGH
+        case EPbk2LaunchAttributeUnassign:
+            {
+            // Launch assign contact service
+            delete iAssignService;
+            iAssignService = NULL;
+            iAssignService = CPbk2AssignService::NewL( iExitMsg );
+            iAssignService->LaunchServiceL( aMessage );
+            break;
+            }
+
+        case EPbk2CancelAssign:
+            {
+            // Synchronous service
+            // Cancel assign service
+            if ( iAssignService )
+                {
+                iAssignService->CancelService( aMessage );
+                }
+            // Complete message if it is not completed by service
+            if ( !aMessage.IsNull() )
+                {                
+                aMessage.Complete( KErrNone );
+                }
+            break;
+            }
+
+        case EPbk2GetResults:
+            {
+            // Synchronous service
+            if ( iFetchService )
+                {
+                iFetchService->GetResultsL( aMessage );
+                }
+            if ( iAssignService )
+                {
+                iAssignService->GetResultsL( aMessage );
+                }                
+            // Complete message if it is not completed by service
+            if ( !aMessage.IsNull() )
+                {                
+                aMessage.Complete( KErrNone );
+                }
+            break;
+            }
+
+        case EPbk2GetResultSize:
+            {
+            // Synchronous service
+            if ( iFetchService )
+                {
+                iFetchService->GetResultSizeL( aMessage );
+                }
+            if ( iAssignService )
+                {
+                iAssignService->GetResultSizeL( aMessage );
+                }
+            // Complete message if it is not completed by service
+            if ( !aMessage.IsNull() )
+                {                
+                aMessage.Complete( KErrNone );
+                }
+            break;
+            }
+
+        case EPbk2ExitRequest:
+            {
+            StoreExitRequest( aMessage );
+            break;
+            }
+
+        case EPbk2CancelExitRequest:
+            {
+            CancelExitRequest( aMessage );
+            break;
+            }
+
+        case EPbk2AcceptRequest:
+            {
+            StoreAcceptRequest( aMessage );
+            break;
+            }
+
+        case EPbk2CancelAcceptRequest:
+            {
+            CancelAcceptRequest( aMessage );
+            break;
+            }
+
+        case EPbk2ExitService:
+            {
+            // Synchronous service
+            // After the client has received a completion
+            // to EPbk2ExitRequest, it must send this
+            // message to fulfill the protocol
+            if ( iFetchService )
+                {
+                iFetchService->TryExitServiceL( aMessage );
+                }
+            if ( iAssignService )
+                {
+                iAssignService->TryExitServiceL( aMessage );
+                }
+            // Complete message if it is not completed by service
+            if ( !aMessage.IsNull() )
+                {                
+                aMessage.Complete( KErrNone );
+                }                
+            break;
+            }
+
+        case EPbk2AcceptService:
+            {
+            // Synchronous service
+            // After the client has received a completion
+            // to EPbk2AcceptRequest, it must send this
+            // message to fulfill the protocol
+            if ( iFetchService )
+                {
+                iFetchService->TryAcceptServiceL( aMessage );
+                }
+            if ( iAssignService )
+                {
+                iAssignService->TryAcceptServiceL( aMessage );
+                }
+            // Complete message if it is not completed by service
+            if ( !aMessage.IsNull() )
+                {                
+                aMessage.Complete( KErrNone );
+                }                
+            break;
+            }
+
+        default:
+            {
+            // Message not recognized, pass it to base class
+            CAknAppServiceBase::ServiceL( aMessage );
+            break;
+            }
+        }
+    }
+
+// --------------------------------------------------------------------------
+// CPbk2AppService::SecurityCheckL
+// Security check performed when client sends a message requesting a service.
+// --------------------------------------------------------------------------
+//
+CPolicyServer::TCustomResult CPbk2AppService::SecurityCheckL
+        ( const RMessage2& aMsg, TInt& aAction, TSecurityInfo& aMissing )
+    {
+    CPolicyServer::TCustomResult res = CPolicyServer::EFail;
+    aAction = CPolicyServer::EPanicClient;
+
+    TInt functionId = aMsg.Function();
+
+    switch ( functionId )
+        {
+        case EPbk2LaunchFetch:
+        case EPbk2CancelFetch:              // FALLTHROUGH
+            {
+            // Fetch needs ReadUserData capability
+            if ( aMsg.HasCapability( ECapabilityReadUserData ) )
+                {
+                res = CPolicyServer::EPass;
+                }
+            break;
+            }
+
+        case EPbk2LaunchAssign:             // FALLTHROUGH
+        case EPbk2CancelAssign:             // FALLTHROUGH
+        case EPbk2LaunchAttributeAssign:    // FALLTHROUGH
+        case EPbk2LaunchAttributeUnassign:
+            {
+            // Assign needs ReadUserData and WriteUserData capabilities
+            if ( aMsg.HasCapability( ECapabilityReadUserData ) &&
+                 aMsg.HasCapability( ECapabilityWriteUserData ) )
+                {
+                res = CPolicyServer::EPass;
+                }
+            break;
+            }
+
+        case EPbk2GetResults:               // FALLTHROUGH
+        case EPbk2GetResultSize:
+            {
+            // Result fetching needs ReadUserData capability
+            if ( aMsg.HasCapability( ECapabilityReadUserData ) )
+                {
+                res = CPolicyServer::EPass;
+                }
+            break;
+            }
+
+        case EPbk2AcceptService:            // FALLTHROUGH
+        case EPbk2AcceptRequest:
+            {
+            // Accepting needs ReadUserData capability
+            if ( aMsg.HasCapability( ECapabilityReadUserData ) )
+                {
+                res = CPolicyServer::EPass;
+                }
+            break;
+            }
+
+        case EPbk2ExitService:              // FALLTHROUGH
+        case EPbk2ExitRequest:              // FALLTHROUGH
+        case EPbk2CancelExitRequest:        // FALLTHROUGH
+        case EPbk2CancelAcceptRequest:
+            {
+            // No capabilities required
+            res = CPolicyServer::EPass;
+            break;
+            }
+
+        default:
+            {
+            // Call base class
+            res = CAknAppServiceBase::SecurityCheckL
+                ( aMsg, aAction, aMissing );
+            break;
+            }
+        }
+
+    return res;
+    }
+
+// --------------------------------------------------------------------------
+// CPbk2AppService::StoreExitRequest
+// --------------------------------------------------------------------------
+//
+void CPbk2AppService::StoreExitRequest( const RMessage2& aMessage )
+    {
+    if ( iExitMsg.Handle() != KNullHandle )
+        {
+        aMessage.Complete( KErrAlreadyExists );
+        }
+    else
+        {
+        iExitMsg = aMessage;
+        }
+    }
+
+// --------------------------------------------------------------------------
+// CPbk2AppService::CancelExitRequest
+// --------------------------------------------------------------------------
+//
+void CPbk2AppService::CancelExitRequest( const RMessage2& aMessage )
+    {
+    if ( iExitMsg.Handle() != KNullHandle )
+        {
+        iExitMsg.Complete( KErrCancel );
+        }
+    aMessage.Complete( KErrNone );
+    }
+
+// --------------------------------------------------------------------------
+// CPbk2AppService::StoreAcceptRequest
+// --------------------------------------------------------------------------
+//
+void CPbk2AppService::StoreAcceptRequest( const RMessage2& aMessage )
+    {
+    if ( iAcceptMsg.Handle() != KNullHandle )
+        {
+        aMessage.Complete( KErrAlreadyExists );
+        }
+    else
+        {
+        iAcceptMsg = aMessage;
+        }
+    }
+
+// --------------------------------------------------------------------------
+// CPbk2AppService::CancelAcceptRequest
+// --------------------------------------------------------------------------
+//
+void CPbk2AppService::CancelAcceptRequest( const RMessage2& aMessage )
+    {
+    if ( iAcceptMsg.Handle() != KNullHandle )
+        {
+        iAcceptMsg.Complete( KErrCancel );
+        }
+    aMessage.Complete( KErrNone );
+    }
+
+// End of File