usbengines/usbwatcher/src/cusbwatchersession.cpp
author Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
Wed, 13 Oct 2010 15:41:46 +0300
branchRCL_3
changeset 92 dde4619868dc
parent 77 5b2a402e96ac
permissions -rw-r--r--
Revision: 201038 Kit: 201041

/*
* Copyright (c) 2006-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:  USB Watcher session class implementation.
*
*/


#include "cusbwatchersession.h"
#include "usbwatchershared.h"
#include "cusbwatcher.h"
#include "cusbwatcherserver.h"
#include "debug.h"

// ----------------------------------------------------------------------------
// Symbian two-phase constructor
// ----------------------------------------------------------------------------
//
CUsbWatcherSession* CUsbWatcherSession::NewL( CUsbWatcherServer* aServer )
    {
    LOG_FUNC

    CUsbWatcherSession* r = new ( ELeave ) CUsbWatcherSession( aServer );
    CleanupStack::PushL( r );
    r->ConstructL();
    CleanupStack::Pop();
    return r;
    }

// ----------------------------------------------------------------------------
// C++ constructor
// ----------------------------------------------------------------------------
//
CUsbWatcherSession::CUsbWatcherSession( CUsbWatcherServer* aServer )
    : iUsbWatcherServer( aServer )
    {
    LOG_FUNC

    }

// ----------------------------------------------------------------------------
// Second-phase constructor
// ----------------------------------------------------------------------------
//
void CUsbWatcherSession::ConstructL()
    {
    LOG_FUNC

    iUsbWatcherServer->Watcher().RegisterObserverL( this );
    }

// ----------------------------------------------------------------------------
// Desstructor
// ----------------------------------------------------------------------------
//
CUsbWatcherSession::~CUsbWatcherSession()
    {
    LOG_FUNC

    // if server isn't exist then session can not be exist
    if ( iUsbWatcherServer )
        {
        iUsbWatcherServer->Watcher().DeRegisterObserver( this );
        }
    }

// ----------------------------------------------------------------------------
// Request handle entry point
// ----------------------------------------------------------------------------
//
void CUsbWatcherSession::ServiceL( const RMessage2& aMessage )
    {
    LOG_FUNC

    DispatchMessageL( aMessage );
    }

// ----------------------------------------------------------------------------
// Request dispatch function
// ----------------------------------------------------------------------------
//
void CUsbWatcherSession::DispatchMessageL( const RMessage2& aMessage )
    {
    LOG_FUNC

    LOG1( "Message = %d", aMessage.Function() );

    TBool complete( ETrue );
    TInt ret( KErrNone );


    switch ( aMessage.Function() )
        {
        case EUsbWatcherSetPersonality:
            ret = SetPersonality( aMessage, complete );
            break;

        case EUsbWatcherCancelSetPersonality:
            ret = CancelSetPersonality( aMessage, complete );
            break;

        case EUsbWatcherSetPreviousPersonality:
            ret = SetPreviousPersonality( aMessage, complete );
            break;

        case EUsbWatcherSetPreviousPersonalitySync:
            ret = SetPreviousPersonalitySync( aMessage, complete );
            break;

        case EUsbWatcherCancelSetPreviousPersonality:
            ret = CancelSetPreviousPersonality( aMessage, complete );
            break;

        case EUsbWatcherSetPreviousPersonalityOnDisconnect:
            ret = SetPreviousPersonalityOnDisconnect( aMessage, complete );
            break;

        default:
            aMessage.Panic( KUsbWatcherCliPncCat, EUsbWatcherPanicIllegalIPC );
            break;
        }

    if ( complete )
        {
        aMessage.Complete( ret );
        }
    }

// ----------------------------------------------------------------------------
// Set certain personality
// ----------------------------------------------------------------------------
//
TInt CUsbWatcherSession::SetPersonality( const RMessage2& aMessage,
        TBool& aComplete )
    {
    LOG_FUNC

    if( iSetPersonalityOutstanding )
        {
        LOG( "Completing outstanding" );
        iSetPersonalityMessage.Complete( KErrNone );
        iSetPersonalityOutstanding = EFalse;
        }

    // Cancel all other pending requests
    iUsbWatcherServer->Watcher().Notify( KErrCancel );

    iSetPersonalityMessage = aMessage;
    aComplete = EFalse;
    iSetPersonalityOutstanding = ETrue;

    //Set force parameter to this session.
    SetAskOnConnectionSuppression( aMessage.Int1() );

    iUsbWatcherServer->Watcher().SetPersonality( aMessage.Int0(),
        static_cast<TBool>( aMessage.Int2() ) );

    return KErrNone;
    }

// ----------------------------------------------------------------------------
// Cancel pending set personality request
// ----------------------------------------------------------------------------
//
TInt CUsbWatcherSession::CancelSetPersonality( const RMessage2& aMessage,
        TBool& aComplete )
    {
    LOG_FUNC

    if ( !iSetPersonalityOutstanding )
        {
        LOG( "No outstanding SetPersonality request" );
        return KErrNone;
        }

    SetAskOnConnectionSuppression( EFalse );
    aComplete = EFalse;
    iCancelSetPersonalityMessage = aMessage;
    iCancelSetPersonalityOutstanding = ETrue;

    iUsbWatcherServer->Watcher().CancelSetPersonality();

    return KErrNone;
    }

// ----------------------------------------------------------------------------
// Change to previous personality, asynchronous version
// ----------------------------------------------------------------------------
//
TInt CUsbWatcherSession::SetPreviousPersonality( const RMessage2& aMessage,
        TBool& aComplete )
    {
    LOG_FUNC

    if( iSetPreviousPersonalityOutstanding )
        {
        iSetPreviousPersonalityMessage.Complete( KErrNone );
        iSetPreviousPersonalityOutstanding = EFalse;
        }

    // Cancel all other pending requests
    iUsbWatcherServer->Watcher().Notify( KErrCancel );

    SetAskOnConnectionSuppression( EFalse );
    iSetPreviousPersonalityOutstanding = ETrue;
    iSetPreviousPersonalityMessage = aMessage;
    aComplete = EFalse;

    iUsbWatcherServer->Watcher().SetPreviousPersonality();

    return KErrNone;
    }

// ----------------------------------------------------------------------------
// Change to previous personality, synchronous version
// ----------------------------------------------------------------------------
//
TInt CUsbWatcherSession::SetPreviousPersonalitySync( const RMessage2& /*aMsg*/,
        TBool& /*aComplete*/ )
    {
    LOG_FUNC

    if( iSetPreviousPersonalityOutstanding )
        {
        iSetPreviousPersonalityMessage.Complete( KErrNone );
        iSetPreviousPersonalityOutstanding = EFalse;
        }

    // Cancel all other pending requests
    iUsbWatcherServer->Watcher().Notify( KErrCancel );

    SetAskOnConnectionSuppression( EFalse );
    iUsbWatcherServer->Watcher().SetPreviousPersonality();

    return KErrNone;
    }

// ----------------------------------------------------------------------------
// Cancel pending request to set previous personality
// ----------------------------------------------------------------------------
//
TInt CUsbWatcherSession::CancelSetPreviousPersonality( const RMessage2& aMsg,
        TBool& aComplete )
    {
    LOG_FUNC

    if( !iSetPreviousPersonalityOutstanding )
        {
        return KErrNone;
        }

    aComplete = EFalse;
    iCancelSetPreviousPersonalityMessage = aMsg;
    iCancelSetPreviousPersonalityOutstanding = ETrue;

    iUsbWatcherServer->Watcher().CancelSetPreviousPersonality();

    return KErrNone;
    }

// ----------------------------------------------------------------------------
// Set the flag to restore personality when disconnected
// ----------------------------------------------------------------------------
//
TInt CUsbWatcherSession::SetPreviousPersonalityOnDisconnect( const RMessage2&
        /*aMessage*/, TBool& /*aComplete*/ )
    {
    LOG_FUNC

    //connected currently, so ask on connection can be enabled
    SetAskOnConnectionSuppression( EFalse );
    iUsbWatcherServer->Watcher().SetPreviousPersonalityOnDisconnect();

    return KErrNone;
    }

// ----------------------------------------------------------------------------
// Complete request
// ----------------------------------------------------------------------------
//
void CUsbWatcherSession::Notify( TInt /*aPersonalityId*/, TInt aStatus )
    {
    LOG_FUNC

    if( iCancelSetPersonalityOutstanding )
        {
        iCancelSetPersonalityOutstanding = EFalse;
        iCancelSetPersonalityMessage.Complete( KErrNone );

        iSetPersonalityMessage.Complete( aStatus );
        iSetPersonalityOutstanding = EFalse;
        }

    if ( iSetPersonalityOutstanding )
        {
        iSetPersonalityMessage.Complete( aStatus );
        iSetPersonalityOutstanding = EFalse;
        }

    if ( iCancelSetPreviousPersonalityOutstanding )
        {
        iCancelSetPreviousPersonalityOutstanding = EFalse;
        iCancelSetPreviousPersonalityMessage.Complete( KErrNone );

        iSetPreviousPersonalityMessage.Complete( aStatus );
        iSetPreviousPersonalityOutstanding = EFalse;
        }

    if ( iSetPreviousPersonalityOutstanding )
        {
        iSetPreviousPersonalityMessage.Complete( aStatus );
        iSetPreviousPersonalityOutstanding = EFalse;
        }
    }

// ----------------------------------------------------------------------------
// Set or clear AskOnConnection suppression
// ----------------------------------------------------------------------------
//
void CUsbWatcherSession::SetAskOnConnectionSuppression( TBool aSuppress )
    {
    LOG_FUNC

    iSuppressAskOnConnection = aSuppress;
    }

// ----------------------------------------------------------------------------
// Check if AskOnConnection is suppressed
// ----------------------------------------------------------------------------
//
TBool CUsbWatcherSession::IsAskOnConnectionSuppressed()
    {
    LOG_FUNC

    return iSuppressAskOnConnection;
    }

// End of file