sl@0: // Copyright (c) 2007-2009 Nokia Corporation and/or its subsidiary(-ies). sl@0: // All rights reserved. sl@0: // This component and the accompanying materials are made available sl@0: // under the terms of "Eclipse Public License v1.0" sl@0: // which accompanies this distribution, and is available sl@0: // at the URL "http://www.eclipse.org/legal/epl-v10.html". sl@0: // sl@0: // Initial Contributors: sl@0: // Nokia Corporation - initial contribution. sl@0: // sl@0: // Contributors: sl@0: // sl@0: // Description: sl@0: // sl@0: sl@0: #include sl@0: #include "MmfDrmPluginServerProxy.h" sl@0: #include "MmfDrmPluginServerStart.h" sl@0: #include "MmfDrmPluginClientServer.h" sl@0: #include "../../../inc/mmf/common/mmfbase.hrh" // get the UID sl@0: sl@0: #define KMaxServerNameLength 256 sl@0: sl@0: static const TUid KUidDRMPluginServer = {KUidMmfDrmPluginServerDefine}; sl@0: sl@0: /* sl@0: * patchable const data values defined in MmfDrmPluginServerConst.cpp sl@0: */ sl@0: IMPORT_C extern const TInt KMmfDrmPluginServerTimeOut; sl@0: sl@0: EXPORT_C TInt RMMFDRMPluginServerProxy::Open() sl@0: { sl@0: sl@0: const TUidType serverUid(KNullUid, KNullUid, KUidDRMPluginServer); sl@0: sl@0: // Assume the server is already running and attempt to create a session sl@0: // 4 message slots sl@0: TInt err = CreateSession(KDrmPluginServerName, TVersion(KMMFDRMPluginServerVersion, sl@0: KMMFDRMPluginServerMinorVersionNumber, sl@0: KMMFDRMPluginServerBuildVersionNumber)); sl@0: if(err == KErrNotFound) sl@0: { sl@0: // Server not running sl@0: // Construct the server binary name sl@0: TBuf serverFile; sl@0: RProcess server; sl@0: sl@0: err = server.Create(KDrmPluginServerFileName, KNullDesC, serverUid); sl@0: if(err != KErrNone) sl@0: return err; sl@0: // Synchronise with the server sl@0: TRequestStatus reqStatus; sl@0: server.Rendezvous(reqStatus); sl@0: sl@0: if (reqStatus!=KRequestPending) sl@0: { sl@0: server.Kill(0); sl@0: } sl@0: else sl@0: { sl@0: // Start the test harness sl@0: server.Resume(); sl@0: // Server will call the reciprocal static synchronise call sl@0: } sl@0: User::WaitForRequest(reqStatus); // wait for rendezvous or death sl@0: server.Close(); sl@0: TInt reqStatusValue = reqStatus.Int(); sl@0: if(reqStatusValue == KErrNoMemory || reqStatusValue == KErrNotFound) sl@0: { sl@0: // All error codes except KErrNoMemory and KErrNotFound are assumed sl@0: // to be a duplicate server instance dying, then keep trying connection sl@0: // to the server. This can happen when two servers attempt to start sl@0: // at the same time. sl@0: return reqStatusValue; sl@0: } sl@0: // Create the root server session sl@0: err = CreateSession(KDrmPluginServerName, TVersion(KMMFDRMPluginServerVersion, sl@0: KMMFDRMPluginServerMinorVersionNumber, sl@0: KMMFDRMPluginServerBuildVersionNumber)); sl@0: } sl@0: if (err == KErrNone) sl@0: { sl@0: SendReceive(EMMFSetDrmPluginServerTimeout, KMmfDrmPluginServerTimeOut); sl@0: } sl@0: sl@0: return err; sl@0: } sl@0: sl@0: EXPORT_C TInt RMMFDRMPluginServerProxy::LaunchControllerServer(TUint aMaxHeapSize, TBool aUseSharedHeap, sl@0: TThreadId& aControllerThreadId, TUint aStackSize) sl@0: { sl@0: TPckg maxHeapSize(aMaxHeapSize); sl@0: TPckg userSharedHeap(aUseSharedHeap); sl@0: TPckgBuf threadId; sl@0: TPckg stackSize(aStackSize); sl@0: TIpcArgs args(&maxHeapSize, &userSharedHeap, &threadId, &stackSize); sl@0: TInt err = RSessionBase::SendReceive(EMMFControllerLaunchRequest, args); sl@0: aControllerThreadId = threadId(); sl@0: return err; sl@0: } sl@0: sl@0: EXPORT_C TInt RMMFDRMPluginServerProxy::GetControllerSessionHandle() sl@0: { sl@0: return RSessionBase::SendReceive(EMMFControllerSessionHandle); sl@0: } sl@0: sl@0: EXPORT_C TInt RMMFDRMPluginServerProxy::PanicControllerThread(TThreadId aTid, const TDesC& aCategory,TInt aReason) sl@0: { sl@0: TPckgBuf threadId(aTid); sl@0: TPckg reason(aReason); sl@0: sl@0: TIpcArgs args(&threadId, &aCategory, &reason); sl@0: return RSessionBase::SendReceive(EMMFControllerThreadPanic, args); sl@0: } sl@0: sl@0: EXPORT_C TInt RMMFDRMPluginServerProxy::KillControllerThread(TThreadId aTid, TInt aReason) sl@0: { sl@0: TPckgBuf threadId(aTid); sl@0: TPckg reason(aReason); sl@0: sl@0: TIpcArgs args(&threadId, &reason); sl@0: return RSessionBase::SendReceive(EMMFControllerThreadKill, args); sl@0: } sl@0: sl@0: EXPORT_C TInt RMMFDRMPluginServerProxy::SetThreadPriority(TThreadId aTid, TThreadPriority aPriority) sl@0: { sl@0: TPckgBuf threadId(aTid); sl@0: TPckgBuf priority(aPriority); sl@0: sl@0: TIpcArgs args(&threadId, &priority); sl@0: return RSessionBase::SendReceive(EMMFControllerSetThreadPriority, args); sl@0: } sl@0: sl@0: EXPORT_C void RMMFDRMPluginServerProxy::OpenDataContentL(const TDesC& aFilePath, const TDesC8& aInitData) sl@0: { sl@0: TIpcArgs args(&aFilePath, &aInitData); sl@0: User::LeaveIfError(RSessionBase::SendReceive(EMMFDRMContentOpenByFilePath, args)); sl@0: } sl@0: sl@0: EXPORT_C void RMMFDRMPluginServerProxy::OpenDataContentL(const RFile& aFile, const TDesC8& aInitData) sl@0: { sl@0: TIpcArgs args(NULL, NULL, &aInitData); sl@0: User::LeaveIfError(aFile.TransferToServer(args, 0, 1)); sl@0: User::LeaveIfError(RSessionBase::SendReceive(EMMFDRMContentOpenByFileHandle, args)); sl@0: } sl@0: sl@0: EXPORT_C TInt RMMFDRMPluginServerProxy::EvaluateDataContentIntent(TIntent aIntent) sl@0: { sl@0: TPckgBuf intentPckg(aIntent); sl@0: return RSessionBase::SendReceive(EMMFDRMContentEvaluateIntent, TIpcArgs(&intentPckg)); sl@0: } sl@0: sl@0: EXPORT_C TBool RMMFDRMPluginServerProxy::GetDataContentMimeTypeL(TDes8& aMimeType) sl@0: { sl@0: TPckg success(EFalse); sl@0: TIpcArgs args(&aMimeType, &success); sl@0: User::LeaveIfError(RSessionBase::SendReceive(EMMFDRMContentGetMimeType, args)); sl@0: return success(); sl@0: } sl@0: sl@0: EXPORT_C void RMMFDRMPluginServerProxy::GetDataContentFileHeaderL(TDes8& aHeaderData, TInt aMaxLength) sl@0: { sl@0: TIpcArgs args(aMaxLength, &aHeaderData); sl@0: User::LeaveIfError(RSessionBase::SendReceive(EMMFDRMContentGetFileHeader, args)); sl@0: } sl@0: