1.1 --- /dev/null Thu Jan 01 00:00:00 1970 +0000
1.2 +++ b/os/mm/mmlibs/mmfw/SecureDRM/src/Server/MmfDrmPluginServerSession.cpp Fri Jun 15 03:10:57 2012 +0200
1.3 @@ -0,0 +1,394 @@
1.4 +// Copyright (c) 2007-2009 Nokia Corporation and/or its subsidiary(-ies).
1.5 +// All rights reserved.
1.6 +// This component and the accompanying materials are made available
1.7 +// under the terms of "Eclipse Public License v1.0"
1.8 +// which accompanies this distribution, and is available
1.9 +// at the URL "http://www.eclipse.org/legal/epl-v10.html".
1.10 +//
1.11 +// Initial Contributors:
1.12 +// Nokia Corporation - initial contribution.
1.13 +//
1.14 +// Contributors:
1.15 +//
1.16 +// Description:
1.17 +//
1.18 +
1.19 +#include <mmf/common/mmfcontrollerframework.h>
1.20 +#include "MmfDrmPluginServerSession.h"
1.21 +#include "MmfDrmPluginClientServer.h"
1.22 +#include "MmfDrmPluginServer.h"
1.23 +
1.24 +/*
1.25 + Create a DRM Plugin Server Session
1.26 + */
1.27 +CMMFDRMPluginServerSession* CMMFDRMPluginServerSession::NewL()
1.28 + {
1.29 + CMMFDRMPluginServerSession* self = new(ELeave) CMMFDRMPluginServerSession();
1.30 + return self;
1.31 + }
1.32 +
1.33 +CMMFDRMPluginServerSession::~CMMFDRMPluginServerSession()
1.34 + {
1.35 + CMMFDRMPluginServer* server =
1.36 + const_cast<CMMFDRMPluginServer*>(static_cast<const CMMFDRMPluginServer*>(Server()));
1.37 + if (server)
1.38 + {
1.39 + server->DecrementSessionId();
1.40 + }
1.41 + if (iData)
1.42 + {
1.43 + delete iData;
1.44 + }
1.45 + iControllerSessionHandle.Close();
1.46 + }
1.47 +
1.48 +void CMMFDRMPluginServerSession::CreateL(const CMmfIpcServer& aServer)
1.49 + {
1.50 + CMmfIpcSession::CreateL(aServer);
1.51 + CMMFDRMPluginServer* server =
1.52 + static_cast<CMMFDRMPluginServer*>(CONST_CAST(CMmfIpcServer*, &aServer));
1.53 + server->IncrementSessionId();
1.54 + }
1.55 +
1.56 +void CMMFDRMPluginServerSession::ServiceL(const RMmfIpcMessage& aMessage)
1.57 + {
1.58 + switch (aMessage.Function())
1.59 + {
1.60 + case EMMFControllerLaunchRequest:
1.61 + DoLaunchControllerL(aMessage);
1.62 + aMessage.Complete(KErrNone);
1.63 + break;
1.64 + case EMMFControllerSessionHandle:
1.65 + if (!iControllerSessionHandle.Handle())
1.66 + {
1.67 + User::Leave(KErrNotReady);
1.68 + }
1.69 + aMessage.Complete(iControllerSessionHandle);
1.70 + break;
1.71 + case EMMFControllerThreadPanic:
1.72 + DoPanicControllerThreadL(aMessage);
1.73 + aMessage.Complete(KErrNone);
1.74 + break;
1.75 + case EMMFControllerThreadKill:
1.76 + DoKillControllerThreadL(aMessage);
1.77 + aMessage.Complete(KErrNone);
1.78 + break;
1.79 + case EMMFControllerSetThreadPriority:
1.80 + DoSetThreadPriorityL(aMessage);
1.81 + aMessage.Complete(KErrNone);
1.82 + break;
1.83 + case EMMFDRMContentOpenByFilePath:
1.84 + DoOpenContentByFilePathL(aMessage);
1.85 + aMessage.Complete(KErrNone);
1.86 + break;
1.87 + case EMMFDRMContentOpenByFileHandle:
1.88 + DoOpenContentByFileHandleL(aMessage);
1.89 + aMessage.Complete(KErrNone);
1.90 + break;
1.91 + case EMMFDRMContentEvaluateIntent:
1.92 + {
1.93 + TInt err = DoEvaluateContentIntent(aMessage);
1.94 + aMessage.Complete(err);
1.95 + }
1.96 + break;
1.97 + case EMMFDRMContentGetMimeType:
1.98 + DoGetContentMimeTypeL(aMessage);
1.99 + aMessage.Complete(KErrNone);
1.100 + break;
1.101 + case EMMFDRMContentGetFileHeader:
1.102 + DoGetContentFileHeaderL(aMessage);
1.103 + aMessage.Complete(KErrNone);
1.104 + break;
1.105 + case EMMFSetDrmPluginServerTimeout:
1.106 + DoSetDrmPluginServerTimeout(aMessage);
1.107 + aMessage.Complete(KErrNone);
1.108 + break;
1.109 + default:
1.110 + User::Leave(KErrNotSupported);
1.111 + break;
1.112 + }
1.113 + }
1.114 +
1.115 +CMMFDRMPluginServerSession::CMMFDRMPluginServerSession()
1.116 + {
1.117 + }
1.118 +
1.119 +void CMMFDRMPluginServerSession::DoLaunchControllerL(const RMmfIpcMessage& aMessage)
1.120 + {
1.121 + if (iControllerSessionHandle.Handle())
1.122 + {
1.123 + User::Leave(KErrAlreadyExists);
1.124 + }
1.125 + TThreadId controllerTID;
1.126 + RMMFControllerServerProxy controllerSessionHandle;
1.127 + CMMFDRMPluginServer* server =
1.128 + const_cast<CMMFDRMPluginServer*>(static_cast<const CMMFDRMPluginServer*>(Server()));
1.129 +
1.130 + RThread clientThread;
1.131 + CleanupClosePushL(clientThread);
1.132 + User::LeaveIfError(aMessage.Client(clientThread));
1.133 +
1.134 + TPckg<TUint> maxHeapSize(0);
1.135 + TPckg<TBool> useShareHeap(ETrue);
1.136 + TPckg<TBool> stackSize(0);
1.137 +
1.138 + aMessage.ReadL(0, maxHeapSize);
1.139 + aMessage.ReadL(1, useShareHeap);
1.140 + aMessage.ReadL(3, stackSize);
1.141 +
1.142 + User::LeaveIfError(server->StartControllerServer(clientThread, maxHeapSize(), useShareHeap(),
1.143 + controllerSessionHandle, controllerTID, stackSize()));
1.144 + SetControllerServerInfo(controllerSessionHandle, controllerTID);
1.145 +
1.146 + TPckgBuf<TThreadId> threadId(iControllerThreadID);
1.147 + aMessage.WriteL(2, threadId);
1.148 + CleanupStack::PopAndDestroy(&clientThread);
1.149 + }
1.150 +
1.151 +void CMMFDRMPluginServerSession::DoPanicControllerThreadL(const RMmfIpcMessage& aMessage)
1.152 + {
1.153 + TPckgBuf<TThreadId> controllerTid(0);
1.154 + aMessage.ReadL(0, controllerTid);
1.155 +
1.156 + TInt desLen = aMessage.GetDesLengthL(1);
1.157 + HBufC* category = HBufC::NewLC(desLen);
1.158 + TPtr categoryPtr(category->Des());
1.159 + aMessage.ReadL(1, categoryPtr);
1.160 +
1.161 + TPckg<TInt> panicReason(0);
1.162 + aMessage.ReadL(2, panicReason);
1.163 +
1.164 + CMMFDRMPluginServer* server =
1.165 + const_cast<CMMFDRMPluginServer*>(static_cast<const CMMFDRMPluginServer*>(Server()));
1.166 + server->PanicControllerThread(controllerTid(), categoryPtr, panicReason());
1.167 +
1.168 + CleanupStack::PopAndDestroy(category);
1.169 + }
1.170 +
1.171 +void CMMFDRMPluginServerSession::DoKillControllerThreadL(const RMmfIpcMessage& aMessage)
1.172 + {
1.173 + TPckgBuf<TThreadId> controllerTid(0);
1.174 + aMessage.ReadL(0, controllerTid);
1.175 +
1.176 + TPckg<TInt> killReason(0);
1.177 + aMessage.ReadL(1, killReason);
1.178 +
1.179 + CMMFDRMPluginServer* server =
1.180 + const_cast<CMMFDRMPluginServer*>(static_cast<const CMMFDRMPluginServer*>(Server()));
1.181 + server->KillControllerThread(controllerTid(), killReason());
1.182 + }
1.183 +
1.184 +void CMMFDRMPluginServerSession::SetControllerServerInfo(RHandleBase& aControllerSessionHandle,
1.185 + TThreadId& aControllerThreadId)
1.186 + {
1.187 + iControllerSessionHandle = aControllerSessionHandle;
1.188 + iControllerThreadID = aControllerThreadId;
1.189 + }
1.190 +
1.191 +void CMMFDRMPluginServerSession::DoSetThreadPriorityL(const RMmfIpcMessage& aMessage)
1.192 + {
1.193 + TPckgBuf<TThreadId> threadId;
1.194 + TPckgBuf<TThreadPriority> priority;
1.195 +
1.196 + aMessage.ReadL(0, threadId);
1.197 + aMessage.ReadL(1, priority);
1.198 +
1.199 + CMMFDRMPluginServer* server =
1.200 + const_cast<CMMFDRMPluginServer*>(static_cast<const CMMFDRMPluginServer*>(Server()));
1.201 + User::LeaveIfError(server->SetThreadPriority(threadId(), priority()));
1.202 + }
1.203 +
1.204 +void CMMFDRMPluginServerSession::DoOpenContentByFilePathL(const RMmfIpcMessage& aMessage)
1.205 + {
1.206 + if (iData == NULL)
1.207 + {
1.208 + TInt length = aMessage.GetDesLengthL(0);
1.209 + HBufC* filePath = HBufC::NewLC(length);
1.210 + TPtr filePathPtr(filePath->Des());
1.211 + aMessage.ReadL(0, filePathPtr);
1.212 +
1.213 + length = aMessage.GetDesLengthL(1);
1.214 + HBufC8* initData = HBufC8::NewLC(length);
1.215 + TPtr8 initDataPtr(initData->Des());
1.216 + aMessage.ReadL(1, initDataPtr);
1.217 +
1.218 + HBufC* uniqueId = NULL;
1.219 + TBool UIEnabled;
1.220 + ContentAccess::TIntent intent;
1.221 + GetContentInitDataL(initDataPtr, uniqueId, UIEnabled, intent);
1.222 + CleanupStack::PopAndDestroy(initData);
1.223 + CleanupStack::PushL(uniqueId);
1.224 +
1.225 + iData = CData::NewL(TVirtualPathPtr(filePathPtr, *uniqueId), EContentShareReadWrite);
1.226 + TInt err = iData->SetProperty(EAgentPropertyAgentUI, UIEnabled);
1.227 + if (err != KErrNone && err != KErrCANotSupported)
1.228 + {
1.229 + // KErrCANotSupported isn't a problem for us so eat the error code.
1.230 + User::Leave(err);
1.231 + }
1.232 + User::LeaveIfError(iData->EvaluateIntent(intent));
1.233 +
1.234 + CleanupStack::PopAndDestroy(2, filePath); // uniqueId, filePath
1.235 + }
1.236 + else
1.237 + {
1.238 + User::Leave(KErrAlreadyExists);
1.239 + }
1.240 + }
1.241 +
1.242 +void CMMFDRMPluginServerSession::DoOpenContentByFileHandleL(const RMmfIpcMessage& aMessage)
1.243 + {
1.244 + if (iData == NULL)
1.245 + {
1.246 + RFile file;
1.247 + User::LeaveIfError(file.AdoptFromClient(aMessage, 0, 1));
1.248 + CleanupClosePushL(file);
1.249 +
1.250 + TInt length = aMessage.GetDesLengthL(2);
1.251 + HBufC8* initData = HBufC8::NewLC(length);
1.252 + TPtr8 initDataPtr(initData->Des());
1.253 + aMessage.ReadL(2, initDataPtr);
1.254 +
1.255 + HBufC* uniqueId = NULL;
1.256 + TBool UIEnabled;
1.257 + ContentAccess::TIntent intent;
1.258 + GetContentInitDataL(initDataPtr, uniqueId, UIEnabled, intent);
1.259 + CleanupStack::PopAndDestroy(initData);
1.260 + CleanupStack::PushL(uniqueId);
1.261 +
1.262 + iData = CData::NewL(file, *uniqueId);
1.263 + TInt err = iData->SetProperty(EAgentPropertyAgentUI, UIEnabled);
1.264 + if (err != KErrNone && err != KErrCANotSupported)
1.265 + {
1.266 + // KErrCANotSupported isn't a problem for us so eat the error code.
1.267 + User::Leave(err);
1.268 + }
1.269 + User::LeaveIfError(iData->EvaluateIntent(intent));
1.270 +
1.271 + CleanupStack::PopAndDestroy(2, &file); // uniqueId, file
1.272 + }
1.273 + else
1.274 + {
1.275 + User::Leave(KErrAlreadyExists);
1.276 + }
1.277 + }
1.278 +
1.279 +void CMMFDRMPluginServerSession::GetContentInitDataL(const TDesC8& aInitData, HBufC*& aUniqueId,
1.280 + TBool& aUIEnabled, ContentAccess::TIntent& aIntent)
1.281 + {
1.282 + if (aUniqueId)
1.283 + {
1.284 + delete aUniqueId;
1.285 + aUniqueId = NULL;
1.286 + }
1.287 +
1.288 + RDesReadStream stream(aInitData);
1.289 + CleanupClosePushL(stream);
1.290 +
1.291 + TInt length = stream.ReadInt32L();
1.292 + aUniqueId = HBufC::NewLC(length);
1.293 + TPtr ptr = aUniqueId->Des();
1.294 + stream.ReadL(ptr, length);
1.295 +
1.296 + aUIEnabled = stream.ReadInt32L();
1.297 + TPckgBuf<ContentAccess::TIntent> intentPckg;
1.298 + stream.ReadL(intentPckg);
1.299 + aIntent = intentPckg();
1.300 +
1.301 + CleanupStack::Pop(aUniqueId);
1.302 + CleanupStack::PopAndDestroy(&stream);
1.303 + }
1.304 +
1.305 +TInt CMMFDRMPluginServerSession::DoEvaluateContentIntent(const RMmfIpcMessage& aMessage)
1.306 + {
1.307 + TInt err;
1.308 + if (iData)
1.309 + {
1.310 + TPckgBuf<TIntent> intentPckg;
1.311 + err = aMessage.Read(0, intentPckg);
1.312 + if (err == KErrNone)
1.313 + {
1.314 + err = iData->EvaluateIntent(intentPckg());
1.315 + }
1.316 + }
1.317 + else
1.318 + {
1.319 + err = KErrGeneral;
1.320 + }
1.321 + return err;
1.322 + }
1.323 +
1.324 +void CMMFDRMPluginServerSession::DoGetContentMimeTypeL(const RMmfIpcMessage& aMessage)
1.325 + {
1.326 + if (iData)
1.327 + {
1.328 + TBool success = ETrue;
1.329 + TInt length = aMessage.GetDesMaxLengthL(0);
1.330 +
1.331 + HBufC* mimeType = HBufC::NewLC(length);
1.332 + TPtr mimeTypePtr = mimeType->Des();
1.333 + TInt err = iData->GetStringAttribute(EMimeType, mimeTypePtr);
1.334 +
1.335 + if (err == KErrNone)
1.336 + {
1.337 + HBufC8* mimeType8 = HBufC8::NewLC(length);
1.338 + TPtr8 mimeTypePtr8 = mimeType8->Des();
1.339 + mimeTypePtr8.Copy(mimeTypePtr);
1.340 +
1.341 + aMessage.WriteL(0, mimeTypePtr8);
1.342 + CleanupStack::PopAndDestroy(mimeType8);
1.343 + }
1.344 + else
1.345 + {
1.346 + success = EFalse;
1.347 + }
1.348 + CleanupStack::PopAndDestroy(mimeType);
1.349 +
1.350 + TPckg<TBool> successPckg(success);
1.351 + aMessage.WriteL(1, successPckg);
1.352 + }
1.353 + else
1.354 + {
1.355 + User::Leave(KErrGeneral);
1.356 + }
1.357 + }
1.358 +
1.359 +void CMMFDRMPluginServerSession::DoGetContentFileHeaderL(const RMmfIpcMessage& aMessage)
1.360 + {
1.361 + if (iData)
1.362 + {
1.363 + TInt size = 0;
1.364 + iData->DataSizeL(size);
1.365 +
1.366 + TInt maxLength = aMessage.Int0();
1.367 +
1.368 + TInt desLength = aMessage.GetDesMaxLengthL(1);
1.369 + HBufC8* header = HBufC8::NewLC(desLength);
1.370 + TPtr8 headerPtr = header->Des();
1.371 +
1.372 + if (size > 0)
1.373 + {
1.374 + if (size > maxLength)
1.375 + {
1.376 + size = maxLength;
1.377 + }
1.378 + TInt pos = 0;
1.379 + User::LeaveIfError(iData->Seek(ESeekStart, pos));
1.380 + User::LeaveIfError(iData->Read(headerPtr, size));
1.381 + aMessage.WriteL(1, headerPtr);
1.382 + }
1.383 + CleanupStack::PopAndDestroy(header);
1.384 + }
1.385 + else
1.386 + {
1.387 + User::Leave(KErrGeneral);
1.388 + }
1.389 + }
1.390 +
1.391 +void CMMFDRMPluginServerSession::DoSetDrmPluginServerTimeout(const RMmfIpcMessage& aMessage)
1.392 + {
1.393 + CMMFDRMPluginServer* server =
1.394 + const_cast<CMMFDRMPluginServer*>(static_cast<const CMMFDRMPluginServer*>(Server()));
1.395 + server->SetTimeout(aMessage.Int0());
1.396 + }
1.397 +