diff -r 000000000000 -r 95b198f216e5 omadrm/drmhelper/src/DRMHelperClient.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/omadrm/drmhelper/src/DRMHelperClient.cpp Thu Dec 17 08:52:27 2009 +0200 @@ -0,0 +1,613 @@ +/* +* Copyright (c) 2004-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: Implementation of the Helper Client session functionality +* +*/ + + +// INCLUDE FILES +#include +#include +#include +#include "DRMHelperCommon.h" +#include "DRMHelperClient.h" + + +// LOCAL CONSTANTS AND MACROS +// Number of message slots to reserve for this client server session. +// Since we only communicate synchronously here, we never have any +// outstanding asynchronous requests. +LOCAL_C const TUint KDefaultMessageSlots = 0; +LOCAL_C const TUid KServerUid3 = {0x101F6DC5}; + +#ifdef __WINS__ +LOCAL_C const TUint KServerMinHeapSize = 0x1000; // 4K +LOCAL_C const TUint KServerMaxHeapSize = 0x10000; // 64K +#endif + +// ============================ 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 TDesC& aText ); +LOCAL_C void WriteL( const TDesC8& aText ); +LOCAL_C void WriteCurrentTimeL(); +#endif + + +LOCAL_C TInt FromFileNameToUri(const TDesC16& aFileName , HBufC8*& aContentUri ); +LOCAL_C TInt CheckExpiration( const TDesC8& aUri , TTime& aEndTime , TInt& aCountLeft ); +LOCAL_C TInt StartServer(); +LOCAL_C TInt CreateServerProcess(); + + + +// ============================ MEMBER FUNCTIONS =============================== + +// ----------------------------------------------------------------------------- +// RDRMHelperClient::RDRMHelperClient +// C++ default constructor can NOT contain any code, that +// might leave. +// ----------------------------------------------------------------------------- +// +EXPORT_C RDRMHelperClient::RDRMHelperClient() +: RSessionBase() + { + // No implementation required + } + +// ----------------------------------------------------------------------------- +// RDRMHelperClient::Connect +// +// Connect to the server session +// ----------------------------------------------------------------------------- +// +EXPORT_C TInt RDRMHelperClient::Connect() + { +#ifdef _DRM_TESTING + TRAPD( err , CreateLogL() ); + if (err) + { + return err; + } + TRAP( err , WriteL(_L("Connect")) ); + if (err) + { + return err; + } + TRAP( err , WriteCurrentTimeL() ); + if (err) + { + return err; + } +#endif + TInt error = StartServer(); + + if (KErrNone == error) + { + + error = CreateSession(KDRMHelperServerName, + Version(), + KDefaultMessageSlots); + } + return error; + } + +// ----------------------------------------------------------------------------- +// RDRMHelperClient::Version +// +// return server version +// ----------------------------------------------------------------------------- +// +EXPORT_C TVersion RDRMHelperClient::Version() const + { + return(TVersion(KDRMHSMajorVersionNumber, + KDRMHSMinorVersionNumber, + KDRMHSBuildVersionNumber)); + } + +// ----------------------------------------------------------------------------- +// RDRMHelperClient::SetAutomated +// +// Register one content uri to the helper server +// ----------------------------------------------------------------------------- +// +EXPORT_C TInt RDRMHelperClient::SetAutomated( const TDesC8& aUri , const TInt& aType ) const + { + TInt temp = aType; + TPtrC8 descriptor(aUri); + + // This call waits for the server to complete the request before + // proceeding. + return SendReceive(ERegister, TIpcArgs( &descriptor, temp ) ); + } + +// ----------------------------------------------------------------------------- +// RDRMHelperClient::SetAutomated +// +// Register one file to the helper server +// ----------------------------------------------------------------------------- +// +EXPORT_C TInt RDRMHelperClient::SetAutomated( const TDesC16& aFileName , const TInt& aType ) const + { + TInt temp = aType; + TPtrC8 descriptor( NULL , 0 ); + + descriptor.Set( reinterpret_cast( aFileName.Ptr() ), aFileName.Length()*2); + + // This call waits for the server to complete the request before + // proceeding. + return SendReceive(ERegisterFile, TIpcArgs( &descriptor, temp ) ); + } + +// ----------------------------------------------------------------------------- +// RDRMHelperClient::RemoveAutomated +// +// Register one content uri to the helper server +// ----------------------------------------------------------------------------- +// +EXPORT_C TInt RDRMHelperClient::RemoveAutomated( const TDesC8& aUri , const TInt& aType ) const + { + TInt temp = aType; + TPtrC8 descriptor(aUri); + + // This call waits for the server to complete the request before + // proceeding. + return SendReceive(ERemove, TIpcArgs( &descriptor, temp ) ); + } + +// ----------------------------------------------------------------------------- +// RDRMHelperClient::RemoveAutomated +// +// Register one file to the helper server +// ----------------------------------------------------------------------------- +// +EXPORT_C TInt RDRMHelperClient::RemoveAutomated( const TDesC16& aFileName , const TInt& aType ) const + { + TInt temp = aType; + TPtrC8 descriptor( NULL , 0 ); + + descriptor.Set( reinterpret_cast( aFileName.Ptr() ), aFileName.Length()*2); + + // This call waits for the server to complete the request before + // proceeding. + return SendReceive(ERemoveFile, TIpcArgs( &descriptor ) ); + } + +// ----------------------------------------------------------------------------- +// RDRMHelperClient::IndicateIdle +// +// Register one file to the helper server +// ----------------------------------------------------------------------------- +// +EXPORT_C TInt RDRMHelperClient::IndicateIdle() const + { + return SendReceive(EIndicateIdle, TIpcArgs()); + } + + +// ----------------------------------------------------------------------------- +// RDRMHelperClient::CanSetAutomated +// +// Register one content uri to the helper server +// ----------------------------------------------------------------------------- +// +EXPORT_C TInt RDRMHelperClient::CanSetAutomated( const TDesC8& aUri , TBool& aValue ) const + { + TTime endTime; + TTime temp; + TInt countsLeft = 0; + TInt err = 0; + temp.Set( KNullDate ); + endTime.Set( KNullDate ); + + err = CheckExpiration( aUri , endTime , countsLeft ); + if ( endTime != temp ) + { + aValue = ETrue; + } + else + { + aValue = EFalse; + } + return err; + } + +// ----------------------------------------------------------------------------- +// RDRMHelperClient::CanSetAutomated +// +// Register one file to the helper server +// ----------------------------------------------------------------------------- +// +EXPORT_C TInt RDRMHelperClient::CanSetAutomated( const TDesC16& aFileName , TBool& aValue ) const + { + HBufC8* contentUri = NULL; + TInt err = 0; + err = FromFileNameToUri( aFileName , contentUri ); + if (err) + { + return err; + } + err = CanSetAutomated( contentUri->Des() , aValue ); + delete contentUri; + return err; + } + + +// ----------------------------------------------------------------------------- +// RDRMHelperClient::IsAutomated +// +// Register one content uri to the helper server +// ----------------------------------------------------------------------------- +// +EXPORT_C TInt RDRMHelperClient::IsAutomated( const TDesC8& aUri , TInt& aType , TBool& aIs ) + { + TPtr8 type( reinterpret_cast< TUint8* >( &aType ), + 0, + sizeof( TInt ) ); + TPtr8 flag( reinterpret_cast< TUint8* >( &aIs ), + 0, + sizeof( TInt ) ); + + TPtrC8 descriptor(aUri); + + // This call waits for the server to complete the request before + // proceeding. + return SendReceive(EIsRegistered, TIpcArgs( &type, &descriptor, &flag ) ); + } + +// ----------------------------------------------------------------------------- +// RDRMHelperClient::IsAutomated +// +// Register one file to the helper server +// ----------------------------------------------------------------------------- +// +EXPORT_C TInt RDRMHelperClient::IsAutomated( const TDesC16& aFileName , TInt& aType , TBool& aIs ) + { + TPtr8 type( reinterpret_cast< TUint8* >( &aType ), + 0, + sizeof( TInt ) ); + TPtr8 flag( reinterpret_cast< TUint8* >( &aIs ), + 0, + sizeof( TInt ) ); + + TPtrC8 descriptor( NULL , 0 ); + + + descriptor.Set( reinterpret_cast( aFileName.Ptr() ), aFileName.Length()*2); + + // This call waits for the server to complete the request before + // proceeding. + return SendReceive(EIsRegisteredFile, TIpcArgs( &type, &descriptor, &flag ) ); + + } + + + +// ============================= LOCAL FUNCTIONS =============================== +// ----------------------------------------------------------------------------- +// StartServer +// +// Start the helper server +// ----------------------------------------------------------------------------- +// +LOCAL_C TInt StartServer() + { + +#ifdef _DRM_TESTING + TRAPD( err , WriteL(_L("StartServer")) ); + if (err) + { + return err; + } + TRAP( err , WriteCurrentTimeL() ); + if (err) + { + return err; + } +#endif + TInt result = 0; + + TFindServer findHelperServer(KDRMHelperServerName); + TFullName name; + + result = findHelperServer.Next(name); + if (result == KErrNone) + { + // Server already running + return KErrNone; + } + + RSemaphore semaphore; + result = semaphore.CreateGlobal(KDRMHelperServerSemaphoreName, 0); + if (result != KErrNone) + { + return result; + } + + result = CreateServerProcess(); + if (result != KErrNone) + { + semaphore.Close(); + return result; + } + + semaphore.Wait(); + semaphore.Close(); + + return KErrNone; + } + +LOCAL_C TInt CreateServerProcess() + { +#ifdef _DRM_TESTING + TRAPD( err , WriteL(_L("CreateServerProcess")) ); + if (err) + { + return err; + } + TRAP( err , WriteCurrentTimeL() ); + if (err) + { + return err; + } +#endif + TInt result; + + const TUidType serverUid(KNullUid, KNullUid, KServerUid3); + +#ifdef __WINS__ + + RLibrary lib; + result = lib.Load( KDRMHSServerFileName , serverUid ); + if (result != KErrNone) + { + return result; + } + +#ifdef _DRM_TESTING + TRAP( err , WriteL(_L("library is loaded")) ); + if (err) + { + return err; + } + TRAP( err , WriteCurrentTimeL() ); + if (err) + { + return err; + } +#endif + + // Get the WinsMain function + TLibraryFunction functionWinsMain = lib.Lookup(1); + + // Call it and cast the result to a thread function + TThreadFunction serverThreadFunction = reinterpret_cast(functionWinsMain()); + + TName threadName(KDRMHelperServerName); + + // Append a random number to make it unique + threadName.AppendNum(Math::Random(), EHex); + + RThread server; + + result = server.Create(threadName, // create new server thread + serverThreadFunction, // thread's main function + KDefaultStackSize, + NULL, + &lib, + NULL, + KServerMinHeapSize, + KServerMaxHeapSize, + EOwnerProcess); + + + + lib.Close(); // if successful, server thread has handle to library now + + if (result != KErrNone) + { + return result; + } +#ifdef _DRM_TESTING + TRAP( err , WriteL(_L("server thread is created")) ); + if (err) + { + return err; + } + TRAP( err , WriteCurrentTimeL() ); + if (err) + { + return err; + } +#endif + server.SetPriority(EPriorityMore); + + +#else + + RProcess server; + result = server.Create( KDRMHSServerFileName, KNullDesC, serverUid); + if (result != KErrNone) + { + return result; + } +#ifdef _DRM_TESTING + TRAP( err , WriteL(_L("server thread is created")) ); + if (err) + { + return err; + } + TRAP( err , WriteCurrentTimeL() ); + if (err) + { + return err; + } +#endif + +#endif + + server.Resume(); + server.Close(); + + return KErrNone; + } + +LOCAL_C TInt FromFileNameToUri(const TDesC16& aFileName , HBufC8*& aContentUri ) + { + DRMAuthenticated* c = NULL; + DRMCommon::TContentProtection protection; + HBufC8* mimeType = NULL; + TUint dataLen = 0; + TRAPD(err , c = DRMAuthenticated::NewL()); + if (err) + { + return err; + } + err = c->GetFileInfo( + aFileName, + protection, + mimeType, + aContentUri, + dataLen); + delete mimeType; + if (err) + { + delete aContentUri; + aContentUri = NULL; + } + return err; + } + + +LOCAL_C TInt CheckExpiration( const TDesC8& aUri , TTime& aEndTime , TInt& aCountLeft ) + { + DRMAuthenticated* c = NULL; + CDRMRights* right = NULL; + TRAPD( err , c = DRMAuthenticated::NewL() ); + if (err) + { + return err; + } + err = c->GetActiveRights( aUri , + DRMCommon::EPlay | DRMCommon::EExecute | DRMCommon::EPrint | DRMCommon::EDisplay , + right ); + if (!err) + { + err = right->GetExpirationDetails( + DRMCommon::EPlay | DRMCommon::EExecute | DRMCommon::EPrint | DRMCommon::EDisplay, + aEndTime, + aCountLeft); + } + delete right; + delete c; + return err; + } + +#ifdef _DRM_TESTING + +LOCAL_C void WriteLogL( const TDesC8& text , RFs &aFs ) + { + _LIT( KLogFile , "c:\\HSClientLog.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 + } + +LOCAL_C void CreateLogL() + { + RFs fs; + User::LeaveIfError(fs.Connect()); + CleanupClosePushL(fs); + RFile file; + User::LeaveIfError( file.Replace( fs , _L("c:\\HSClientLog.txt") , EFileWrite ) ); + file.Close(); + CleanupStack::PopAndDestroy(); //fs + } + +LOCAL_C void WriteL( const TDesC& aText ) + { + RFs fs; + User::LeaveIfError( fs.Connect() ); + CleanupClosePushL(fs); + HBufC8* text = HBufC8::NewLC(1000); + TPtr8 textptr(text->Des() ); + textptr.Append( aText ); + textptr.Append( _L("\r\n") ); + WriteLogL(textptr , fs); + CleanupStack::PopAndDestroy(text); + CleanupStack::PopAndDestroy(); //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 + } + + +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 + } +#endif + +// ========================== OTHER EXPORTED FUNCTIONS ========================= + +// Epoc DLL entry point, return that everything is ok +GLDEF_C TInt E32Dll(TDllReason) + { + return KErrNone; + } + +// End of File