Update contrib.
1 // Copyright (c) 2007-2009 Nokia Corporation and/or its subsidiary(-ies).
2 // All rights reserved.
3 // This component and the accompanying materials are made available
4 // under the terms of "Eclipse Public License v1.0"
5 // which accompanies this distribution, and is available
6 // at the URL "http://www.eclipse.org/legal/epl-v10.html".
8 // Initial Contributors:
9 // Nokia Corporation - initial contribution.
16 #include <mmf/common/mmfcontrollerframework.h>
17 #include "MmfDrmPluginServerSession.h"
18 #include "MmfDrmPluginClientServer.h"
19 #include "MmfDrmPluginServer.h"
22 Create a DRM Plugin Server Session
24 CMMFDRMPluginServerSession* CMMFDRMPluginServerSession::NewL()
26 CMMFDRMPluginServerSession* self = new(ELeave) CMMFDRMPluginServerSession();
30 CMMFDRMPluginServerSession::~CMMFDRMPluginServerSession()
32 CMMFDRMPluginServer* server =
33 const_cast<CMMFDRMPluginServer*>(static_cast<const CMMFDRMPluginServer*>(Server()));
36 server->DecrementSessionId();
42 iControllerSessionHandle.Close();
45 void CMMFDRMPluginServerSession::CreateL(const CMmfIpcServer& aServer)
47 CMmfIpcSession::CreateL(aServer);
48 CMMFDRMPluginServer* server =
49 static_cast<CMMFDRMPluginServer*>(CONST_CAST(CMmfIpcServer*, &aServer));
50 server->IncrementSessionId();
53 void CMMFDRMPluginServerSession::ServiceL(const RMmfIpcMessage& aMessage)
55 switch (aMessage.Function())
57 case EMMFControllerLaunchRequest:
58 DoLaunchControllerL(aMessage);
59 aMessage.Complete(KErrNone);
61 case EMMFControllerSessionHandle:
62 if (!iControllerSessionHandle.Handle())
64 User::Leave(KErrNotReady);
66 aMessage.Complete(iControllerSessionHandle);
68 case EMMFControllerThreadPanic:
69 DoPanicControllerThreadL(aMessage);
70 aMessage.Complete(KErrNone);
72 case EMMFControllerThreadKill:
73 DoKillControllerThreadL(aMessage);
74 aMessage.Complete(KErrNone);
76 case EMMFControllerSetThreadPriority:
77 DoSetThreadPriorityL(aMessage);
78 aMessage.Complete(KErrNone);
80 case EMMFDRMContentOpenByFilePath:
81 DoOpenContentByFilePathL(aMessage);
82 aMessage.Complete(KErrNone);
84 case EMMFDRMContentOpenByFileHandle:
85 DoOpenContentByFileHandleL(aMessage);
86 aMessage.Complete(KErrNone);
88 case EMMFDRMContentEvaluateIntent:
90 TInt err = DoEvaluateContentIntent(aMessage);
91 aMessage.Complete(err);
94 case EMMFDRMContentGetMimeType:
95 DoGetContentMimeTypeL(aMessage);
96 aMessage.Complete(KErrNone);
98 case EMMFDRMContentGetFileHeader:
99 DoGetContentFileHeaderL(aMessage);
100 aMessage.Complete(KErrNone);
102 case EMMFSetDrmPluginServerTimeout:
103 DoSetDrmPluginServerTimeout(aMessage);
104 aMessage.Complete(KErrNone);
107 User::Leave(KErrNotSupported);
112 CMMFDRMPluginServerSession::CMMFDRMPluginServerSession()
116 void CMMFDRMPluginServerSession::DoLaunchControllerL(const RMmfIpcMessage& aMessage)
118 if (iControllerSessionHandle.Handle())
120 User::Leave(KErrAlreadyExists);
122 TThreadId controllerTID;
123 RMMFControllerServerProxy controllerSessionHandle;
124 CMMFDRMPluginServer* server =
125 const_cast<CMMFDRMPluginServer*>(static_cast<const CMMFDRMPluginServer*>(Server()));
127 RThread clientThread;
128 CleanupClosePushL(clientThread);
129 User::LeaveIfError(aMessage.Client(clientThread));
131 TPckg<TUint> maxHeapSize(0);
132 TPckg<TBool> useShareHeap(ETrue);
133 TPckg<TBool> stackSize(0);
135 aMessage.ReadL(0, maxHeapSize);
136 aMessage.ReadL(1, useShareHeap);
137 aMessage.ReadL(3, stackSize);
139 User::LeaveIfError(server->StartControllerServer(clientThread, maxHeapSize(), useShareHeap(),
140 controllerSessionHandle, controllerTID, stackSize()));
141 SetControllerServerInfo(controllerSessionHandle, controllerTID);
143 TPckgBuf<TThreadId> threadId(iControllerThreadID);
144 aMessage.WriteL(2, threadId);
145 CleanupStack::PopAndDestroy(&clientThread);
148 void CMMFDRMPluginServerSession::DoPanicControllerThreadL(const RMmfIpcMessage& aMessage)
150 TPckgBuf<TThreadId> controllerTid(0);
151 aMessage.ReadL(0, controllerTid);
153 TInt desLen = aMessage.GetDesLengthL(1);
154 HBufC* category = HBufC::NewLC(desLen);
155 TPtr categoryPtr(category->Des());
156 aMessage.ReadL(1, categoryPtr);
158 TPckg<TInt> panicReason(0);
159 aMessage.ReadL(2, panicReason);
161 CMMFDRMPluginServer* server =
162 const_cast<CMMFDRMPluginServer*>(static_cast<const CMMFDRMPluginServer*>(Server()));
163 server->PanicControllerThread(controllerTid(), categoryPtr, panicReason());
165 CleanupStack::PopAndDestroy(category);
168 void CMMFDRMPluginServerSession::DoKillControllerThreadL(const RMmfIpcMessage& aMessage)
170 TPckgBuf<TThreadId> controllerTid(0);
171 aMessage.ReadL(0, controllerTid);
173 TPckg<TInt> killReason(0);
174 aMessage.ReadL(1, killReason);
176 CMMFDRMPluginServer* server =
177 const_cast<CMMFDRMPluginServer*>(static_cast<const CMMFDRMPluginServer*>(Server()));
178 server->KillControllerThread(controllerTid(), killReason());
181 void CMMFDRMPluginServerSession::SetControllerServerInfo(RHandleBase& aControllerSessionHandle,
182 TThreadId& aControllerThreadId)
184 iControllerSessionHandle = aControllerSessionHandle;
185 iControllerThreadID = aControllerThreadId;
188 void CMMFDRMPluginServerSession::DoSetThreadPriorityL(const RMmfIpcMessage& aMessage)
190 TPckgBuf<TThreadId> threadId;
191 TPckgBuf<TThreadPriority> priority;
193 aMessage.ReadL(0, threadId);
194 aMessage.ReadL(1, priority);
196 CMMFDRMPluginServer* server =
197 const_cast<CMMFDRMPluginServer*>(static_cast<const CMMFDRMPluginServer*>(Server()));
198 User::LeaveIfError(server->SetThreadPriority(threadId(), priority()));
201 void CMMFDRMPluginServerSession::DoOpenContentByFilePathL(const RMmfIpcMessage& aMessage)
205 TInt length = aMessage.GetDesLengthL(0);
206 HBufC* filePath = HBufC::NewLC(length);
207 TPtr filePathPtr(filePath->Des());
208 aMessage.ReadL(0, filePathPtr);
210 length = aMessage.GetDesLengthL(1);
211 HBufC8* initData = HBufC8::NewLC(length);
212 TPtr8 initDataPtr(initData->Des());
213 aMessage.ReadL(1, initDataPtr);
215 HBufC* uniqueId = NULL;
217 ContentAccess::TIntent intent;
218 GetContentInitDataL(initDataPtr, uniqueId, UIEnabled, intent);
219 CleanupStack::PopAndDestroy(initData);
220 CleanupStack::PushL(uniqueId);
222 iData = CData::NewL(TVirtualPathPtr(filePathPtr, *uniqueId), EContentShareReadWrite);
223 TInt err = iData->SetProperty(EAgentPropertyAgentUI, UIEnabled);
224 if (err != KErrNone && err != KErrCANotSupported)
226 // KErrCANotSupported isn't a problem for us so eat the error code.
229 User::LeaveIfError(iData->EvaluateIntent(intent));
231 CleanupStack::PopAndDestroy(2, filePath); // uniqueId, filePath
235 User::Leave(KErrAlreadyExists);
239 void CMMFDRMPluginServerSession::DoOpenContentByFileHandleL(const RMmfIpcMessage& aMessage)
244 User::LeaveIfError(file.AdoptFromClient(aMessage, 0, 1));
245 CleanupClosePushL(file);
247 TInt length = aMessage.GetDesLengthL(2);
248 HBufC8* initData = HBufC8::NewLC(length);
249 TPtr8 initDataPtr(initData->Des());
250 aMessage.ReadL(2, initDataPtr);
252 HBufC* uniqueId = NULL;
254 ContentAccess::TIntent intent;
255 GetContentInitDataL(initDataPtr, uniqueId, UIEnabled, intent);
256 CleanupStack::PopAndDestroy(initData);
257 CleanupStack::PushL(uniqueId);
259 iData = CData::NewL(file, *uniqueId);
260 TInt err = iData->SetProperty(EAgentPropertyAgentUI, UIEnabled);
261 if (err != KErrNone && err != KErrCANotSupported)
263 // KErrCANotSupported isn't a problem for us so eat the error code.
266 User::LeaveIfError(iData->EvaluateIntent(intent));
268 CleanupStack::PopAndDestroy(2, &file); // uniqueId, file
272 User::Leave(KErrAlreadyExists);
276 void CMMFDRMPluginServerSession::GetContentInitDataL(const TDesC8& aInitData, HBufC*& aUniqueId,
277 TBool& aUIEnabled, ContentAccess::TIntent& aIntent)
285 RDesReadStream stream(aInitData);
286 CleanupClosePushL(stream);
288 TInt length = stream.ReadInt32L();
289 aUniqueId = HBufC::NewLC(length);
290 TPtr ptr = aUniqueId->Des();
291 stream.ReadL(ptr, length);
293 aUIEnabled = stream.ReadInt32L();
294 TPckgBuf<ContentAccess::TIntent> intentPckg;
295 stream.ReadL(intentPckg);
296 aIntent = intentPckg();
298 CleanupStack::Pop(aUniqueId);
299 CleanupStack::PopAndDestroy(&stream);
302 TInt CMMFDRMPluginServerSession::DoEvaluateContentIntent(const RMmfIpcMessage& aMessage)
307 TPckgBuf<TIntent> intentPckg;
308 err = aMessage.Read(0, intentPckg);
311 err = iData->EvaluateIntent(intentPckg());
321 void CMMFDRMPluginServerSession::DoGetContentMimeTypeL(const RMmfIpcMessage& aMessage)
325 TBool success = ETrue;
326 TInt length = aMessage.GetDesMaxLengthL(0);
328 HBufC* mimeType = HBufC::NewLC(length);
329 TPtr mimeTypePtr = mimeType->Des();
330 TInt err = iData->GetStringAttribute(EMimeType, mimeTypePtr);
334 HBufC8* mimeType8 = HBufC8::NewLC(length);
335 TPtr8 mimeTypePtr8 = mimeType8->Des();
336 mimeTypePtr8.Copy(mimeTypePtr);
338 aMessage.WriteL(0, mimeTypePtr8);
339 CleanupStack::PopAndDestroy(mimeType8);
345 CleanupStack::PopAndDestroy(mimeType);
347 TPckg<TBool> successPckg(success);
348 aMessage.WriteL(1, successPckg);
352 User::Leave(KErrGeneral);
356 void CMMFDRMPluginServerSession::DoGetContentFileHeaderL(const RMmfIpcMessage& aMessage)
361 iData->DataSizeL(size);
363 TInt maxLength = aMessage.Int0();
365 TInt desLength = aMessage.GetDesMaxLengthL(1);
366 HBufC8* header = HBufC8::NewLC(desLength);
367 TPtr8 headerPtr = header->Des();
371 if (size > maxLength)
376 User::LeaveIfError(iData->Seek(ESeekStart, pos));
377 User::LeaveIfError(iData->Read(headerPtr, size));
378 aMessage.WriteL(1, headerPtr);
380 CleanupStack::PopAndDestroy(header);
384 User::Leave(KErrGeneral);
388 void CMMFDRMPluginServerSession::DoSetDrmPluginServerTimeout(const RMmfIpcMessage& aMessage)
390 CMMFDRMPluginServer* server =
391 const_cast<CMMFDRMPluginServer*>(static_cast<const CMMFDRMPluginServer*>(Server()));
392 server->SetTimeout(aMessage.Int0());