ximpfw/core/srcpscserver/ximpserver.cpp
author hgs
Wed, 03 Nov 2010 09:32:20 +0530
changeset 51 61fad867f68e
permissions -rw-r--r--
201041

/*
* Copyright (c) 2006 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:  XIMP Framework PSC server class
 *
*/

#include "ximpserverdefs.h"
#include "ximpserver.h"
#include "ximpserversessionadapter.h"
#include "ximptrace.h"
#include "ximpglobals.h"
#include "ximpoperationfactoryimp.h"
#include <ecom/ecom.h>

//Include PSC server namespace
using namespace NXIMPSrv;



// ==============================================================
// =============== PLATSEC POLICY CONFIGURATION =================
// ==============================================================
static const TInt KXIMPServerPlatSecRangeCount = 3;

static const TInt KXIMPServerPlatSecPolicyIndex0 = 0;
static const TInt KXIMPServerPlatSecPolicyIndex1 = 1;

//Ranges for the Request values
static const TInt KXIMPServerPlatSecRanges[ KXIMPServerPlatSecRangeCount ] =
    {
    0,
    NRequest::ECtxSsQueueBindOperation,
    NRequest::EOpCodeTop
    };


// Element indexes for the defined ranges
static const TUint8 KXIMPServerPlatSecElementsIndex[ KXIMPServerPlatSecRangeCount ] =
    {
    KXIMPServerPlatSecPolicyIndex0,
    KXIMPServerPlatSecPolicyIndex1,
    CPolicyServer::ENotSupported
    };


// Policy elements
static const CPolicyServer::TPolicyElement KXIMPServerPlatSecElements[] =
    {
        {
        // Policy 0, KXIMPServerPlatSecPolicyIndex0
        _INIT_SECURITY_POLICY_C3( ECapabilityReadUserData,
                                  ECapabilityWriteUserData,
                                  ECapabilityNetworkServices ),
        CPolicyServer::EFailClient
        },
        {
        // Policy 1, KXIMPServerPlatSecPolicyIndex1
        _INIT_SECURITY_POLICY_C4( ECapabilityReadDeviceData,
                                  ECapabilityReadUserData,
                                  ECapabilityWriteUserData,
                                  ECapabilityNetworkServices ),
        CPolicyServer::EFailClient
        }
    };


// The platsec policy
static const CPolicyServer::TPolicy KXIMPServerPlatSecPolicy =
    {
    // Shortcut to the index into Elements,that is used to check a connection attempt
    KXIMPServerPlatSecPolicyIndex0,

    // Number of ranges in the iRanges array
    KXIMPServerPlatSecRangeCount,

    // A pointer to an array of ordered ranges of request numbers
    KXIMPServerPlatSecRanges,

    // A pointer to an array of TUint8 values specifying
    // the appropriate action to take for each range in iRanges
    KXIMPServerPlatSecElementsIndex,

    // A pointer to an array of distinct policy elements
    KXIMPServerPlatSecElements
    };



// -----------------------------------------------------------------------------
// CXIMPServer::ExecuteL()
// -----------------------------------------------------------------------------
//
void CXIMPServer::ExecuteL()
    {
    // start scheduler
    CActiveScheduler* pA = new( ELeave )CActiveScheduler;
    CleanupStack::PushL( pA );
    CActiveScheduler::Install( pA );

    // create server
    CXIMPServer* server = CXIMPServer::NewLC();

    // rename our thread properly
    // first, find out the UID set by process starter
    TInt uid = 0;
    TInt ret = User::GetTIntParameter( NStartupParam::KProtocolUidIndex,
                                       uid );
    User::LeaveIfError( ret );

    // create the "!XIMPCtxSrv9bde667a" server name
    HBufC* serverName = HBufC::NewLC( NName::KSymbianServer().Length() +
                                      NStartupParam::KProtocolUidMaxLen +
                                      1 );

    serverName->Des().Copy( NName::KSymbianServer );
    serverName->Des().AppendNumFixedWidth( uid,
                                           EHex,
                                           NStartupParam::KProtocolUidMaxLen );

    // and set it
    User::RenameThread( *serverName );
    server->StartL( *serverName );

    CleanupStack::PopAndDestroy( serverName );

    //Signal client that we are started
    RProcess().Rendezvous( KErrNone );

    //Execute the server
    CActiveScheduler::Start(); // CSI: 3 #

    //Cleanup
    CleanupStack::PopAndDestroy( server );//server
    CleanupStack::PopAndDestroy( pA );
    CActiveScheduler::Install( NULL );
    }



// -----------------------------------------------------------------------------
// CXIMPServer::~CXIMPServer()
// -----------------------------------------------------------------------------
//
CXIMPServer::~CXIMPServer()
    {
    CXIMPGlobals::UninstallD();
    REComSession::FinalClose();

    #if _BullseyeCoverage
    cov_write();
    #endif    
    }


// -----------------------------------------------------------------------------
// CXIMPServer::CXIMPServer()
// -----------------------------------------------------------------------------
//
CXIMPServer::CXIMPServer()
    : CPolicyServer( CActive::EPriorityStandard, KXIMPServerPlatSecPolicy )
    {
    iSessionId = 1;   // start from 1. 0 reserved for host-originated operations
    }


// -----------------------------------------------------------------------------
// CXIMPServer::NewLC()
// -----------------------------------------------------------------------------
//
CXIMPServer* CXIMPServer::NewLC()
    {
    CXIMPServer* self = new( ELeave ) CXIMPServer;
    CleanupStack::PushL( self );
    self->ConstructL();
    return self;
    }


// -----------------------------------------------------------------------------
// CXIMPServer::ConstructL()
// -----------------------------------------------------------------------------
//
void CXIMPServer::ConstructL()
    {
    CXIMPOperationFactory* operationFactory = CXIMPOperationFactory::NewL();
    CleanupStack::PushL( operationFactory );
    CXIMPGlobals::InstallL( operationFactory, this );
    CleanupStack::Pop( operationFactory );
    iGlobals = CXIMPGlobals::Instance();
    }


// -----------------------------------------------------------------------------
// CXIMPServer::NewSessionL()
// -----------------------------------------------------------------------------
//
CSession2* CXIMPServer::NewSessionL( const TVersion &aVersion,
                                        const RMessage2& /* aMessage */ ) const
    {
    TVersion srvVersion( NVersion::KMajor,
                         NVersion::KMinor,
                         NVersion::KBuild );

    if( !User::QueryVersionSupported( aVersion, srvVersion ) )
        {
        User::Leave( KErrNotSupported );
        }

    CXIMPServer* self = const_cast< CXIMPServer* >( this );
    self->iSessionId++;
    return CXIMPServerSessionAdapter::NewL( iSessionId, 
                                               *self );
    };


// -----------------------------------------------------------------------------
// CXIMPServer::SessionCreated()
// -----------------------------------------------------------------------------
//
void CXIMPServer::SessionCreated()
    {
    iSessionCount++;
    }


// -----------------------------------------------------------------------------
// CXIMPServer::SessionDied()
// -----------------------------------------------------------------------------
//
void CXIMPServer::SessionDied()
    {
    iSessionCount--;
    TryToStopScheduling();
    }
    
// -----------------------------------------------------------------------------
// CXIMPServer::AllHostsDied()
// -----------------------------------------------------------------------------
//
void CXIMPServer::AllHostsDied()
    {
    // all hosts have died.
    iAllHostsDied = ETrue;
    TryToStopScheduling();
    }

// -----------------------------------------------------------------------------
// CXIMPServer::AllHostsDied()
// -----------------------------------------------------------------------------
//
void CXIMPServer::TryToStopScheduling()
    {
    if( iSessionCount == 0 && iAllHostsDied )
        {
        CActiveScheduler::Stop(); // CSI: 4 #
        }    
    }

// -----------------------------------------------------------------------------
// CXIMPServer::TestListener()
// -----------------------------------------------------------------------------
//
MXIMPSrvTestListener* CXIMPServer::TestListener() const
    {
    return iTestListener;
    }
    
// -----------------------------------------------------------------------------
// CXIMPServer::RegisterTestListener()
// -----------------------------------------------------------------------------
//
void CXIMPServer::RegisterTestListener( MXIMPSrvTestListener* aTestSession )
    {
    iTestListener = aTestSession;
    }
    
// -----------------------------------------------------------------------------
// E32Main()
// ENTRY POINT
// -----------------------------------------------------------------------------
//
GLDEF_C TInt E32Main()
    {
    TRACE( _L("PSC Server E32Main - enter") );

    __UHEAP_MARK;

    CTrapCleanup* tc = CTrapCleanup::New();
    if( !tc )
        {
        return KErrNoMemory;
        }

    User::RenameThread( NName::KMainThread );

    TRAPD( err, CXIMPServer::ExecuteL() );
    delete tc;

    __UHEAP_MARKEND;

    TRACE_1( _L("PSC Server E32Main - exit: %d"), err );
    return err;
    }


//  END OF FILE