omadrm/drmengine/dcfrepository/server/src/DcfRepSrvSes.cpp
changeset 0 95b198f216e5
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/omadrm/drmengine/dcfrepository/server/src/DcfRepSrvSes.cpp	Thu Dec 17 08:52:27 2009 +0200
@@ -0,0 +1,572 @@
+/*
+* Copyright (c) 2002-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:  server session implementation
+*
+*/
+
+
+
+// INCLUDE FILES
+#include    "DcfRepSrv.h"
+#include    "DcfRepSrvSes.h"
+#include    "DcfRepCommon.h"
+#include    "Pair.h"
+#include    <e32std.h>
+#include    <e32base.h>
+
+// EXTERNAL DATA STRUCTURES
+// EXTERNAL FUNCTION PROTOTYPES  
+// CONSTANTS
+const TUint32 KTrustedShutdownClient = 0x10205CB5;
+
+// MACROS
+#define SERVER const_cast< CDcfRepSrv* >( \
+    reinterpret_cast< const CDcfRepSrv* >( Server() ) )
+
+// LOCAL CONSTANTS AND MACROS
+const TInt KSanityDataLengthLow = 0;
+const TInt KSanityDataLengthHigh = 32768;
+
+// MODULE DATA STRUCTURES
+// LOCAL FUNCTION PROTOTYPES
+// FORWARD DECLARATIONS
+
+// #define _DRM_TESTING
+// ============================= LOCAL FUNCTIONS ===============================
+#ifdef _DRM_TESTING
+LOCAL_C void WriteLogL( const TDesC8& text , RFs &aFs );
+LOCAL_C void WriteFileL( const TDesC8& text , RFs &aFs , const TDesC& aName );
+LOCAL_C void CreateLogL();
+LOCAL_C void WriteL( const TDesC8& aText );
+LOCAL_C void WriteL( const TDesC8& aText , TInt aErr );
+LOCAL_C void WriteCurrentTimeL();
+#endif
+
+// -----------------------------------------------------------------------------
+// SanitizeL
+// Performs a sanity check on length parameters
+// -----------------------------------------------------------------------------
+//
+LOCAL_C void SanitizeL( TInt aParam )
+    {
+    if( aParam <= KSanityDataLengthLow || aParam > KSanityDataLengthHigh )
+        {
+        User::Leave(KErrArgument);
+        }
+    }
+    
+// -----------------------------------------------------------------------------
+// Testing stuff
+// -----------------------------------------------------------------------------
+//
+#ifdef _DRM_TESTING
+
+LOCAL_C void WriteLogL( const TDesC8& text , RFs &aFs )
+    {
+    _LIT( KLogFile , "c:\\CDcfRepSrvSes.txt" );
+    WriteFileL( text , aFs , KLogFile );
+    }
+
+LOCAL_C void WriteFileL( const TDesC8& text , RFs &aFs , const TDesC& aName )
+    {
+    RFile file;
+    TInt size;
+    User::LeaveIfError( file.Open( aFs, aName , EFileWrite ) );
+    CleanupClosePushL( file );
+    User::LeaveIfError( file.Size( size ) );
+    User::LeaveIfError( file.Write( size, text ) );
+    CleanupStack::PopAndDestroy(&file); //file
+    }
+
+LOCAL_C void CreateLogL()
+    {
+    RFs fs;
+    User::LeaveIfError(fs.Connect());
+    CleanupClosePushL(fs);
+    RFile file;
+    User::LeaveIfError( file.Replace( fs , _L("c:\\CDcfRepSrvSes.txt") , EFileWrite ) );
+    file.Close();
+    CleanupStack::PopAndDestroy(&fs); //fs
+    }
+
+LOCAL_C void WriteL( const TDesC8& aText )
+    {
+    RFs fs;
+    User::LeaveIfError( fs.Connect() );
+    CleanupClosePushL(fs);
+    HBufC8* text = HBufC8::NewLC(1000);
+    TPtr8 textptr(text->Des() );
+    textptr.Append( aText );
+    textptr.Append( _L8("\r\n") );
+    WriteLogL(textptr , fs);
+    CleanupStack::PopAndDestroy(text);
+    CleanupStack::PopAndDestroy(&fs); //fs
+    WriteCurrentTimeL();
+    }
+
+LOCAL_C void WriteL( const TDesC8& aText , TInt aErr )
+    {
+    _LIT8(KErr,": %d");
+    HBufC8* text = HBufC8::NewLC(1000+20);
+    TBuf8<20> num;
+    TPtr8 textptr(text->Des());
+    textptr.Append(aText);
+    num.Format(KErr(),aErr);
+    textptr.Append(num);
+    WriteL(textptr);
+    CleanupStack::PopAndDestroy(text);
+    }
+
+LOCAL_C void WriteCurrentTimeL()
+    {
+    RFs fs;
+    User::LeaveIfError( fs.Connect() );
+    CleanupClosePushL(fs);
+    HBufC8* text = HBufC8::NewLC(100);
+    TPtr8 textptr(text->Des() );
+// Date and Time display
+    TTime time;
+    time.HomeTime();
+    TBuf<256> dateString;
+    _LIT(KDate,"%*E%*D%X%*N%*Y %1 %2 '%3");
+    time.FormatL(dateString,KDate);
+    textptr.Append(_L( "\r\n\t\tData:\t" ) );
+    textptr.Append( dateString );
+    _LIT(KTime,"%-B%:0%J%:1%T%:2%S%:3%+B");
+    time.FormatL(dateString,KTime);
+    textptr.Append(_L( "\r\n\t\tTime:\t" ) );
+    textptr.Append( dateString );
+    textptr.Append(_L( "\r\n" ) );
+    textptr.Append(_L( "\r\n" ) );
+    WriteLogL(textptr , fs);
+    CleanupStack::PopAndDestroy(text);
+    CleanupStack::PopAndDestroy(&fs); //fs
+    }
+#endif
+// ============================ MEMBER FUNCTIONS ===============================
+
+// -----------------------------------------------------------------------------
+// CDcfRepSrvSes::CDcfRepSrvSes
+// C++ default constructor can NOT contain any code, that
+// might leave.
+// -----------------------------------------------------------------------------
+//
+CDcfRepSrvSes::CDcfRepSrvSes()
+    {
+    }
+
+// -----------------------------------------------------------------------------
+// CDcfRepSrvSes::ConstructL
+// Symbian 2nd phase constructor can leave.
+// -----------------------------------------------------------------------------
+//
+void CDcfRepSrvSes::ConstructL()
+    {
+#ifdef _DRM_TESTING
+    CreateLogL();
+    WriteL(_L8("ConstructL"));
+#endif
+    }
+
+// -----------------------------------------------------------------------------
+// CDcfRepSrvSes::NewL
+// Two-phased constructor.
+// -----------------------------------------------------------------------------
+//
+CDcfRepSrvSes* CDcfRepSrvSes::NewL()
+    {
+    CDcfRepSrvSes* self = new( ELeave ) CDcfRepSrvSes;
+    
+    CleanupStack::PushL( self );
+    self->ConstructL();
+    CleanupStack::Pop(self);
+
+    return self;
+    }
+
+    
+// Destructor
+CDcfRepSrvSes::~CDcfRepSrvSes()
+    {
+#ifdef _DRM_TESTING
+    TRAPD(err,WriteL(_L8("~CDcfRepSrvSes")));
+#endif
+
+    SERVER->RemoveMessageL( iMessage );
+
+
+    if (iCidList)
+        {
+        iCidList->ResetAndDestroy();
+        iCidList->Close();
+        delete iCidList;    
+        }
+        
+    if (iPairList)
+        {
+        iPairList->ResetAndDestroy();
+        iPairList->Close();
+        delete iPairList;    
+        }    
+    }
+
+
+
+// -----------------------------------------------------------------------------
+// CDcfRepSrvSes::ServiceL
+// This method runs DispatchL() under TRAP harness, since every error case
+// can be handled ==> no need to let this function leave.
+// -----------------------------------------------------------------------------
+//
+void CDcfRepSrvSes::ServiceL( const RMessage2& aMessage )
+    {
+#ifdef _DRM_TESTING
+    WriteL(_L8("ServiceL"));
+#endif
+    // Trap possible errors...
+    TRAPD( error, DispatchL( aMessage ) );
+    
+    if ( error )
+        {
+#ifdef _DRM_TESTING
+    WriteL(_L8("ServiceL->error"),error);
+#endif
+        aMessage.Complete( error );
+        return;
+        }
+    }
+
+// -----------------------------------------------------------------------------
+// CDcfRepSrvSes::DispatchL
+// Checks which command the user requested, and forwards the request to 
+// appropriate private method. This helps to keep the code more readable.
+// -----------------------------------------------------------------------------
+//
+void CDcfRepSrvSes::DispatchL( const RMessage2& aMessage ) 
+    {
+#ifdef _DRM_TESTING
+    WriteL(_L8("DispatchL"));
+#endif
+
+    TBool complete = ETrue;
+    switch ( aMessage.Function() )
+        {
+        case EAddFile:
+            AddFileL( aMessage );
+            break;
+        case EFullScan:
+            FullScanL( aMessage );
+            complete = EFalse;
+            break;
+        case EScanAdd:
+            ScanAddL( aMessage );
+            break;
+        case EScanEnd:
+            ScanEndL( aMessage );
+            complete = EFalse;
+            break;
+        case EScanStart:
+            ScanStartL( aMessage );
+            break;
+        case ESetTtidStart:
+            SetTtidStartL( aMessage );
+            break;
+        case ESetTtidAdd:
+            SetTtidAddL( aMessage );
+            break;                    
+        case ESetTtidEnd:
+            SetTtidEndL( aMessage );
+            complete = EFalse;
+            break;
+        case ENotifyIdle:
+            NotifyIdleL( aMessage );
+            complete = EFalse;
+            break;
+        case EStopWatching:
+            StopWatchingL( aMessage );
+            break;
+        default:
+            User::Leave( KErrNotSupported );
+        }
+    if (complete)
+        {
+        aMessage.Complete(KErrNone);
+        }
+    }
+    
+    
+// -----------------------------------------------------------------------------
+// CDcfRepSrvSes::AddFileL
+// -----------------------------------------------------------------------------
+//    
+void CDcfRepSrvSes::AddFileL( const RMessage2& aMessage )
+    {
+#ifdef _DRM_TESTING
+    WriteL(_L8("AddFileL"));
+#endif
+
+    TFileName file;
+    aMessage.ReadL( 0, file );
+    SERVER->AddFileL(file);    
+    }
+    
+// -----------------------------------------------------------------------------
+// CDcfRepSrvSes::FullScanL
+// -----------------------------------------------------------------------------
+//    
+void CDcfRepSrvSes::FullScanL( const RMessage2& aMessage )
+    {
+#ifdef _DRM_TESTING
+    WriteL(_L8("FullScanL"));
+#endif
+
+    TInt err = SERVER->State();
+    if (err!=EStateIdle)
+        {
+        User::Leave(KErrServerBusy);    
+        }
+    else
+        {
+        iMessage = SERVER->SetMessageL(aMessage);
+        SERVER->SetState(EStateFullScan);   
+        User::LeaveIfError(SERVER->Scan());
+        }
+    }
+
+// -----------------------------------------------------------------------------
+// CDcfRepSrvSes::ScanSingleL
+// -----------------------------------------------------------------------------
+//
+void CDcfRepSrvSes::ScanAddL( const RMessage2& aMessage )
+    {
+#ifdef _DRM_TESTING
+    WriteL(_L8("ScanAddL"));
+#endif   
+ 
+    TInt size = 0;
+    HBufC8* cid = NULL;
+    TPtr8 data(NULL,0,0);
+    if (iPreviousAction == EScanStart || iPreviousAction == EScanAdd)
+        {
+        size = aMessage.GetDesLength( 0 );
+        SanitizeL(size);
+        cid = HBufC8::NewMaxLC( size );
+        data.Set( cid->Des() );
+        data.SetLength(size);
+        aMessage.ReadL( 0, data );
+        User::LeaveIfError(iCidList->Append(cid));
+        CleanupStack::Pop(cid);    
+        iPreviousAction = EScanAdd;
+        }
+    }
+    
+// -----------------------------------------------------------------------------
+// CDcfRepSrvSes::ScanEndL
+// -----------------------------------------------------------------------------
+//    
+void CDcfRepSrvSes::ScanEndL( const RMessage2& aMessage )
+    {
+#ifdef _DRM_TESTING
+    WriteL(_L8("ScanEndL"));
+#endif  
+
+    TInt err = 0;
+    if (iPreviousAction == EScanAdd)
+        {
+        err = SERVER->State();
+        if (err!=EStateIdle)
+            {
+            User::Leave(KErrServerBusy);    
+            }
+        else
+            {
+            iMessage = SERVER->SetMessageL(aMessage);
+            SERVER->SetCidList(iCidList);
+            iCidList = NULL;
+            SERVER->SetState(EStateScan);
+            User::LeaveIfError(SERVER->Scan());
+            } 
+        }
+    }
+
+// -----------------------------------------------------------------------------
+// CDcfRepSrvSes::ScanStartL
+// -----------------------------------------------------------------------------
+//
+void CDcfRepSrvSes::ScanStartL( const RMessage2& /*aMessage*/ )
+    {
+    TInt err = SERVER->State();
+    
+    if (err!=EStateIdle)
+        {
+        User::Leave(KErrServerBusy);    
+        }
+    else
+        {
+        if (iCidList)
+            {
+            // clean list
+            iCidList->ResetAndDestroy();    
+            }
+        else
+            {
+            // initilize list
+            iCidList = new (ELeave) RPointerArray<HBufC8>();        
+            }
+        
+        } 
+    iPreviousAction = EScanStart;  
+    }
+
+// -----------------------------------------------------------------------------
+// CDcfRepSrvSes::SetTtidStartL
+// -----------------------------------------------------------------------------
+//    
+void CDcfRepSrvSes::SetTtidStartL( const RMessage2& /*aMessage*/ )
+    {
+#ifdef _DRM_TESTING
+    WriteL(_L8("SetTtidStartL"));
+#endif    
+    
+    TInt err = SERVER->State();
+    if (err!=EStateIdle)
+        {
+        User::Leave(KErrServerBusy);    
+        }    
+    else
+        {
+        if (iPairList)
+            {
+            // clean list
+            iPairList->ResetAndDestroy();    
+            }
+        else
+            {
+            // initilize list
+            iPairList = new (ELeave) RPointerArray<CPair>();        
+            }        
+        }
+    iPreviousAction = ESetTtidStart;  
+    }
+
+// -----------------------------------------------------------------------------
+// CDcfRepSrvSes::SetTtidAddL
+// -----------------------------------------------------------------------------
+//
+void CDcfRepSrvSes::SetTtidAddL( const RMessage2& aMessage )
+    {
+#ifdef _DRM_TESTING
+    WriteL(_L8("SetTtidAddL"));
+#endif 
+
+    TInt size = 0;
+    TPtr8 data(NULL,0,0);
+    if (iPreviousAction == ESetTtidStart || iPreviousAction == ESetTtidAdd)
+        {
+        CPair* pair = CPair::NewL();
+        CleanupStack::PushL(pair);
+        
+        size = aMessage.GetDesLength( 0 );
+        SanitizeL( size );
+        pair->iCid = HBufC8::NewMaxL( size );
+        data.Set( pair->iCid->Des() );
+        data.SetLength(size);
+        aMessage.ReadL( 0, data );
+        
+        
+        size = aMessage.GetDesLength( 1 );
+        SanitizeL( size );
+        pair->iTtid = HBufC8::NewMaxL( size );
+        data.Set( pair->iTtid->Des() );
+        data.SetLength(size);
+        aMessage.ReadL( 1, data );
+        
+        User::LeaveIfError(iPairList->Append(pair));
+        CleanupStack::Pop(pair);
+            
+        iPreviousAction = ESetTtidAdd;
+        }    
+    }
+
+
+    
+// -----------------------------------------------------------------------------
+// CDcfRepSrvSes::SetTtidEndL
+// -----------------------------------------------------------------------------
+//    
+void CDcfRepSrvSes::SetTtidEndL( const RMessage2& aMessage )
+    {
+#ifdef _DRM_TESTING
+    WriteL(_L8("SetTtidEndL"));
+#endif 
+
+    TInt err = 0;
+    if (iPreviousAction == ESetTtidAdd)
+        {
+        err = SERVER->State();
+        if (err!=EStateIdle)
+            {
+            User::Leave(KErrServerBusy);    
+            }
+        else
+            {
+            iMessage = SERVER->SetMessageL(aMessage);
+            SERVER->SetPairList(iPairList);
+            iPairList = NULL;
+            SERVER->SetState(EStateSetTtid);
+            User::LeaveIfError(SERVER->Scan());
+            } 
+        }   
+    }
+
+// -----------------------------------------------------------------------------
+// CDcfRepSrvSes::NotifyIdleL
+// -----------------------------------------------------------------------------
+//    
+void CDcfRepSrvSes::NotifyIdleL( const RMessage2& aMessage )
+    {
+#ifdef _DRM_TESTING
+    WriteL(_L8("NotifyIdleL"));
+#endif
+
+    TInt err = SERVER->State();
+    if (err==EStateIdle)
+        {
+#ifdef _DRM_TESTING
+    WriteL(_L8("NotifyIdleL->Idle"));
+#endif
+        aMessage.Complete(KErrNone);
+        }
+    else
+        {
+        iMessage = SERVER->SetMessageL(aMessage);
+        }
+    }
+
+// -----------------------------------------------------------------------------
+// CDcfRepSrvSes::StopWatchingL
+// -----------------------------------------------------------------------------
+//    
+void CDcfRepSrvSes::StopWatchingL( const RMessage2& aMessage )
+    {
+#ifdef _DRM_TESTING
+    WriteL(_L8("StopWatchingL"));
+#endif
+    _LIT_SECURITY_POLICY_S0( sidCheck, KTrustedShutdownClient );
+    if ( sidCheck.CheckPolicy( aMessage ) )
+        {
+        SERVER->StopWatchingL();
+        }
+    }
+//  End of File