devicemgmtnotifications/dmdevdialogserver/src/dmdevicedialogsession.cpp
author Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
Tue, 31 Aug 2010 16:04:06 +0300
branchRCL_3
changeset 61 b183ec05bd8c
permissions -rw-r--r--
Revision: 201033 Kit: 201035

/*
 * Copyright (c) 2009 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: Implementation of DM Device Dialogs
 */

#include "dmdevicedialogsession.h"
#include "dmdevdialogclientserver.h"

// ----------------------------------------------------------------------------------------
// CDmDeviceDialogSession::CDmDeviceDialogSession
// ----------------------------------------------------------------------------------------
CDmDeviceDialogSession::CDmDeviceDialogSession()
    {    
    }

// ----------------------------------------------------------------------------------------
// CDmDeviceDialogSession::~CDmDeviceDialogSession
// ----------------------------------------------------------------------------------------
CDmDeviceDialogSession::~CDmDeviceDialogSession()
    {
    FLOG(_L("CDmDeviceDialogSession::~CDmDeviceDialogSession-- begin"));    
    if ( !Server().RequestPending() )
        {
        FLOG(_L("CDmDeviceDialogSession::~CDmDeviceDialogSession Stopserver"));
        Server().StopServer();
        }
    FLOG(_L("CDmDeviceDialogSession::~CDmDeviceDialogSession-- end"));
    }

// ----------------------------------------------------------------------------------------
// CDmDeviceDialogSession::Server
// ----------------------------------------------------------------------------------------
CDmDeviceDialogServer& CDmDeviceDialogSession::Server()
    {
    return *static_cast<CDmDeviceDialogServer*> (const_cast<CServer2*> (CSession2::Server()));
    }

// ----------------------------------------------------------------------------------------
// CDmDeviceDialogSession::CheckClientSecureIdL
// ----------------------------------------------------------------------------------------
TBool CDmDeviceDialogSession::CheckClientSecureId(const RMessage2& aMessage)
    {
    TUid fota = TUid::Uid(KFotaServerUid);
    TUid sosserver = TUid::Uid(KSosServerUid);
    TUid scomo = TUid::Uid(KScomoServerUid);

    // Fotaserver
    if (aMessage.SecureId() == fota.iUid)
        {
        FLOG(_L("[CDmDeviceDialogSession] CheckClientSecureId client is \
		fotaserver!"));
        return ETrue;
        }

    // Sosserver
    else if (aMessage.SecureId() == sosserver.iUid)
        {
        FLOG(_L("[CDmDeviceDialogSession] CheckClientSecureId client is \
      sosserver!"));
        return ETrue;
        }
    // Scomoserver
        else if (aMessage.SecureId() == scomo.iUid)
            {
            FLOG(_L("[CDmDeviceDialogSession] CheckClientSecureId client is \
          SCOMO server!"));
            return ETrue;
            }
    // test app
    else if (aMessage.SecureId() == 0x102073E4)
        {
        FLOG(_L("[CDmDeviceDialogSession] CheckClientSecureId client is \
        testapp!"));
        return ETrue;
        }
    else
        {
        FLOG(_L("[CDmDeviceDialogSession] CheckClientSecureId client 0x%X is\
                 unknown (msg %d), bailing out"),
                aMessage.SecureId().iId, aMessage.Function());        
        }
    return EFalse;
    }

// ----------------------------------------------------------------------------------------
// CDmDeviceDialogSession::ServiceL
// ----------------------------------------------------------------------------------------
void CDmDeviceDialogSession::ServiceL(const RMessage2& aMessage)
    {
    RThread clt;
    aMessage.ClientL(clt);
    TFullName cltnm = clt.FullName();
    FLOG(_L( "CDmDeviceDialogSession::ServiceL      %d   serving for %S?" ),
            aMessage.Function(), &cltnm);
    if (CheckClientSecureId(aMessage))
        {
        FLOG(_L( "CDmDeviceDialogSession::ServiceL access ok"));
		Server().CancelServerCloseRequest();
		if(!Server().IsPkgZeroNoteDisplaying() || aMessage.Function() == 
		        ECancelServerAlert )
		    {
            TRAPD(err,DispatchMessageL(aMessage));
            FLOG(_L( "CDmDeviceDialogSession::ServiceL err is %d"), err);
            User::LeaveIfError(err);
		    }
		else //User not responded to earlier package zero, so no other services 
		    {
            FLOG(_L( "CDmDeviceDialogSession::ServiceL server is busy"));
            aMessage.Complete(KErrServerBusy);
		    }        
        }
    else
        {
        FLOG(_L( "CDmDeviceDialogSession::ServiceL access denied"));
        aMessage.Complete(KErrAccessDenied);
        }
    }

// ----------------------------------------------------------------------------------------
// CDmDeviceDialogSession::ServiceError
// ----------------------------------------------------------------------------------------
void CDmDeviceDialogSession::ServiceError(const RMessage2& aMessage,
        TInt aError)
    {
    CSession2::ServiceError(aMessage, aError);
    }

// ----------------------------------------------------------------------------------------
// CDmDeviceDialogSession::DispatchMessageL
// ----------------------------------------------------------------------------------------
void CDmDeviceDialogSession::DispatchMessageL(const RMessage2& aMessage)
    {
    FLOG(_L("CDmDeviceDialogSession::DispatchMessageL-begin"));
    iMessage = aMessage;
    switch (aMessage.Function())
        {
        case EServerAlert:
            {
            FLOG(_L("CDmDeviceDialogSession::DispatchMessageL \
                     Server alert case:"));
            TInt Uimode = aMessage.Int2();
            if (Uimode == CDmDeviceDialogServer::ESANSilent)
                aMessage.Complete(KErrNone);
            else
                {
                Server().NewAsyncRequest();
                TInt ProfileId = aMessage.Int0();
                TInt JobId = aMessage.Int1();
                TInt ReplySlot = 3;
                Server().LaunchPkgZeroNoteL(ProfileId, JobId, ReplySlot, Uimode,
                        iMessage);
                }
            }
            break;
        case EPkgConnectNoteIsActive:
            {
            FLOG(_L("CDmDeviceDialogSession::DispatchMessageL EPkgZeroOngoing \
                     case:"));
            TBool ret = Server().IsConenctDialogDisplaying();
            TPckgBuf<TInt> callactive(ret);
            aMessage.WriteL(0, callactive);
            aMessage.Complete(KErrNone);
            }
            break;
        case EPkgZeroConnectNoteDismiss:
            {
            FLOG(_L("CDmDeviceDialogSession::DispatchMessageL \
                    EPkgZeroConnectNoteDismiss case:"));
            if (Server().IsConenctDialogDisplaying())
                Server().DismissDialog();
            aMessage.Complete(KErrNone);
            }
            break;
        case EPkgZeroConnectNoteShowAgain:
            {
            FLOG(_L("CDmDeviceDialogSession::DispatchMessageL \
                    EPkgZeroConnectNoteShow case:"));
            if (!Server().IsConenctDialogDisplaying())
                Server().ShowConnectDialogAgainL();
            aMessage.Complete(KErrNone);
            }
            break;
        case EShowDisplayAlert:
            {
            FLOG(_L("CDmDeviceDialogSession::DispatchMessageL \
                    EDisplayAlert case:"));	
            HBufC* alerttext = HBufC::NewLC(aMessage.GetDesLengthL(0));
            TPtr bufPtr = alerttext->Des();
            aMessage.ReadL(0, bufPtr, 0);
            Server().NewAsyncRequest();
            Server().ShowDisplayalertL(bufPtr, iMessage);
            CleanupStack::PopAndDestroy();             
            }
            break;
        case EShowConfirmationalert:
            {          
            HBufC* alerttext = HBufC::NewLC(aMessage.GetDesLengthL(2));
            TPtr alerttxtptr = alerttext->Des();
            aMessage.ReadL(2, alerttxtptr);
            HBufC* alertheader = HBufC::NewLC(aMessage.GetDesLengthL(1));
            TPtr alertheaderptr = alertheader->Des();
            aMessage.ReadL(1, alertheaderptr);
            Server().NewAsyncRequest();
            Server().ShowConfirmationalertL(aMessage.Int0(), alertheaderptr,
                    alerttxtptr, iMessage);
            CleanupStack::PopAndDestroy(2);
            }
            break;
        case ECancelServerAlert:
            {          
            Server().CancelPendingServerAlert();
            aMessage.Complete(KErrNone);
            }
            break;    
        default:
            {
            FLOG(_L("CDmDeviceDialogSession::DispatchMessageL default case: \
                    and a leave happened"));            
            User::Leave(KErrArgument);
            }
        }
    FLOG(_L("CDmDeviceDialogSession::DispatchMessageL:end"));
    }
//End of file