omadrm/drmengine/notifier/src/DRMNotifierServer.cpp
author Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
Thu, 17 Dec 2009 08:52:27 +0200
changeset 0 95b198f216e5
permissions -rw-r--r--
Revision: 200949 Kit: 200951

/*
* Copyright (c) 2004 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:  DRM3 Engine manages all DRM related database operations.
*
*/



// INCLUDE FILES
#include <e32std.h>
#include "DRMNotifierServer.h"
#include "drmnotifierclientserver.h"
#include "drmcommonclientserver.h"

// EXTERNAL DATA STRUCTURES
// EXTERNAL FUNCTION PROTOTYPES  
// CONSTANTS
// MACROS

#define _LOGBUFNUM( a, b )
#define LOGBUFNUM( a, b )
#define LOG( a )

// LOCAL CONSTANTS AND MACROS
LOCAL_C const TUint8 KMaxStartTries = 5;
LOCAL_C const TInt KWaitingTime = 1000000; // 10 secs
_LIT( KNotifierThread, "drmnotifier" );

// MODULE DATA STRUCTURES
using DRMNotifier::KServerMajorVersion;
using DRMNotifier::KServerMinorVersion;
using DRMNotifier::KServerBuildVersion;

// LOCAL FUNCTION PROTOTYPES
LOCAL_C TInt StartNotifierServer( RSemaphore& aClientSem );

// FORWARD DECLARATIONS

// ============================= LOCAL FUNCTIONS ===============================


// -----------------------------------------------------------------------------
// Function StartNotifierServer().
// This function starts the actual server under TRAP harness and starts
// waiting for connections. This function returns only if there has been
// errors during server startup or the server is stopped for some reason.
// 
// Returns: TInt: Symbian OS error code.
// -----------------------------------------------------------------------------
TInt StartNotifierServer( RSemaphore& aClientSem ) 

    {
    TInt error = KErrNone;
    CDRMNotifierServer* server = NULL;

    TUint8 count = 0;

#ifdef _DRM_TESTING
    TTime time;
    _LIT8( KDRMErrorDebugText, "Error: " );
    RFs fs;
    RFile file;

    TFileName filename;

    time.UniversalTime();
    
    TRAPD( error2, time.FormatL( filename, KDateTimeFormat ) );
    filename.Append( _L( "DRMNotifier.txt " ) );
    
    error = fs.Connect();
    if ( error )
        {
        return error;
        }

    file.Replace( fs, filename, EFileStreamText | EFileWrite );
    file.Write( _L8( "Started." ) );
#endif

    do 
    {
       _LOGBUFNUM( KDRMErrorDebugText, error );
       
       ++count;
       
       TRAP( error, ( server = CDRMNotifierServer::NewL() ) );
       
       if ( error ) 
       {
          User::After( TTimeIntervalMicroSeconds32(KWaitingTime) );
       }
       
    } while( error && ( count <= KMaxStartTries ) );
    
    if( error ) 
    {
       
#ifdef _DRM_TESTING
       _LOGBUFNUM( _L8( "Failed: " ), error );
        file.Close();
        fs.Close();
#endif
        // Failed
        return error;
        }

#ifdef _DRM_TESTING
    file.Write( _L8( "OK!" ) );
    file.Close();
    fs.Close();
#endif

#ifdef __WINS__
    
    //UserSvr::ServerStarted();
#endif        
    // Release the semaphore...
    aClientSem.Signal();
    aClientSem.Close();
    
    // Start waiting for connections
    CActiveScheduler::Start();
    
    // Dying.
    // Delete CDRMRigntsServer
    delete server;
    
    return KErrNone;
    }

// ============================ MEMBER FUNCTIONS ===============================

// -----------------------------------------------------------------------------
// CDRMNotifierServer::NewLC
// Two-phased constructor.
// -----------------------------------------------------------------------------
//
CDRMNotifierServer* CDRMNotifierServer::NewL()
    {
    CDRMNotifierServer* self = new( ELeave ) CDRMNotifierServer();
    
    CleanupStack::PushL( self );
    
    self->ConstructL();
    
    CleanupStack::Pop( self );
    
    return self;
    }

// -----------------------------------------------------------------------------
// Destructor
// -----------------------------------------------------------------------------
CDRMNotifierServer::~CDRMNotifierServer() 
    {
    if( iStorage )
        {
        delete iStorage;
        iStorage = 0;
        }   
    
    LOG( _L8( "Dying..." ) );
    
#ifdef _DRM_TESTING
    delete iLog;
#endif
    }

// -----------------------------------------------------------------------------
// CDRMNotifierServer::RunErrorL
// From CActive. Complete the request and restart the scheduler.
// -----------------------------------------------------------------------------
//
TInt CDRMNotifierServer::RunError( TInt aError ) 
    {
    // Inform the client.
    Message().Complete( aError );
    
    // Restart the scheduler.
    ReStart();
    
    // Error handled.
    return KErrNone;
    }

// -----------------------------------------------------------------------------
// CDRMNotifierServer::NewSessionL
// Called when a client requires a new instance.
// -----------------------------------------------------------------------------
CSession2* CDRMNotifierServer::NewSessionL(
    const TVersion& aVersion,
    const RMessage2& /*aMessage*/) const
    {
    RThread client;
    LOG( _L8( "NewSessionL" ) );
    
    // Check that the versions are compatible.
    if ( ! User::QueryVersionSupported( TVersion( KServerMajorVersion,
                                                  KServerMinorVersion,
                                                  KServerBuildVersion ), 
                                        aVersion ) ) 
        {
        // Sorry, no can do.
        User::Leave( KErrNotSupported );
        }
    
    LOG( _L8( "NewSessionL: Creating a new session" ) );
    
    return CDRMNotifierSession::NewL( iStorage );
    }

// -----------------------------------------------------------------------------
// CDRMNotifierServer::CDRMNotifierServer
// C++ default constructor can NOT contain any code, that
// might leave.
// -----------------------------------------------------------------------------
//
CDRMNotifierServer::CDRMNotifierServer() : 
    CServer2( EPriorityStandard )
    {
    // Nothing
    }
    
// -----------------------------------------------------------------------------
// CDRMNotifierServer::ConstructL
// Symbian 2nd phase constructor can leave.
// -----------------------------------------------------------------------------
//
void CDRMNotifierServer::ConstructL() 
    {
    RFs fs;

    // Ignore errors
    User::RenameThread( KNotifierThread );
    
    User::LeaveIfError( fs.Connect() );
    
    fs.Close();

#ifdef _DRM_TESTING
    _LIT( KLogFile, "notifier.txt" );
    TFileName logFile( KLogFile );
    TTime time;
    time.UniversalTime();
    
    time.FormatL( logFile, KDateTimeFormat );
    logFile.Append( KLogFile );

    iLog = CLogFile::NewL( logFile, ETrue );
    iLog->SetAutoFlush( ETrue );
    iLog->SetAutoNewline( ETrue );
    
    LOG( _L8( "DRM Server starting..." ) );
#endif
    iStorage = CDRMMessageStorage::NewL();
    
    LOG( _L8( "Notification Server started." ) );
    
    // Add the server to the scheduler.
    StartL( DRMNotifier::KServerName );
    }


#ifdef _DRM_TESTING

// -----------------------------------------------------------------------------
// CDRMNotifierServer::Log
// Logging operation.
// -----------------------------------------------------------------------------
//
void CDRMNotifierServer::Log( const TDesC8& aLog ) const
    {
    iLog->Log( aLog );
    }


void CDRMNotifierServer::Log( const TDesC& aLog ) const
    {
    iLog->Log( aLog );
    }
#endif

// ========================== OTHER EXPORTED FUNCTIONS =========================
// -----------------------------------------------------------------------------
// Function StartupNotifier().
// This function starts the actual DRM Notifier
// the cleanup stack and active scheduler.
// Returns: TInt: Symbian OS error code.
// -----------------------------------------------------------------------------
//

TInt StartupNotifier( TAny* ) 
    {
    TInt error = KErrNone;
    CTrapCleanup* trap = CTrapCleanup::New();
    
    // Check that memory allocation was successful.
    __ASSERT_ALWAYS( trap, User::Invariant() );
    
    CActiveScheduler* scheduler = new CActiveScheduler();
    
    __ASSERT_ALWAYS( scheduler, User::Invariant() );
    
    CActiveScheduler::Install( scheduler );
    
    RSemaphore clientSem;
    error = clientSem.OpenGlobal( KDRMEngCommonSemaphore );
    if( error ) 
        {
    	  return error;
        }
    error = StartNotifierServer( clientSem );
    
    if ( error ) {
        // If errors didn't occur, signal has been sent.
        clientSem.Signal();
        clientSem.Close();
        }
    
    delete scheduler; 
    scheduler = NULL;
    
    delete trap;
    trap = NULL;
    
    // __ASSERT_ALWAYS( !error, User::Invariant() );
    
    return KErrNone;
    }

//  End of File