sl@0
|
1 |
// Copyright (c) 2002-2009 Nokia Corporation and/or its subsidiary(-ies).
|
sl@0
|
2 |
// All rights reserved.
|
sl@0
|
3 |
// This component and the accompanying materials are made available
|
sl@0
|
4 |
// under the terms of "Eclipse Public License v1.0"
|
sl@0
|
5 |
// which accompanies this distribution, and is available
|
sl@0
|
6 |
// at the URL "http://www.eclipse.org/legal/epl-v10.html".
|
sl@0
|
7 |
//
|
sl@0
|
8 |
// Initial Contributors:
|
sl@0
|
9 |
// Nokia Corporation - initial contribution.
|
sl@0
|
10 |
//
|
sl@0
|
11 |
// Contributors:
|
sl@0
|
12 |
//
|
sl@0
|
13 |
// Description:
|
sl@0
|
14 |
//
|
sl@0
|
15 |
|
sl@0
|
16 |
#include <e32math.h>
|
sl@0
|
17 |
#include <mmf/server/mmfdrmpluginserverproxy.h>
|
sl@0
|
18 |
#include "mmfcontrollerframework.h"
|
sl@0
|
19 |
#include "mmfcontroller.h"
|
sl@0
|
20 |
#include "mmfcontrollerheap.h"
|
sl@0
|
21 |
#include "mmfcontrollerframeworkpriv.h"
|
sl@0
|
22 |
#include "mmfcontrollerpatchdata.h"
|
sl@0
|
23 |
|
sl@0
|
24 |
#ifdef SYMBIAN_ENABLE_SPLIT_HEADERS
|
sl@0
|
25 |
#include <mmf/common/mmfcontrollerextendeddata.h>
|
sl@0
|
26 |
#include <mmf/common/mmfcustomcommandparsermanager.h>
|
sl@0
|
27 |
#include <mmf/common/mmfcontrollerframeworkclasses.h>
|
sl@0
|
28 |
#endif
|
sl@0
|
29 |
|
sl@0
|
30 |
// Panic
|
sl@0
|
31 |
|
sl@0
|
32 |
enum
|
sl@0
|
33 |
{
|
sl@0
|
34 |
EPanicHeapHalfOpen=1,
|
sl@0
|
35 |
EPanicHeapOpenWithoutTls,
|
sl@0
|
36 |
EPanicReleaseWithoutRegister,
|
sl@0
|
37 |
EPanicBadInvariant
|
sl@0
|
38 |
};
|
sl@0
|
39 |
|
sl@0
|
40 |
#ifdef _DEBUG
|
sl@0
|
41 |
static void Panic(TInt aReason)
|
sl@0
|
42 |
{
|
sl@0
|
43 |
_LIT(KControllerFramework, "ControllerFramework");
|
sl@0
|
44 |
User::Panic(KControllerFramework, aReason);
|
sl@0
|
45 |
}
|
sl@0
|
46 |
#endif
|
sl@0
|
47 |
|
sl@0
|
48 |
EXPORT_C RMMFControllerProxy::RMMFControllerProxy() :
|
sl@0
|
49 |
iDestinationPckg(TMMFMessageDestination(KUidInterfaceMMFControllerProxy, KMMFObjectHandleControllerProxy)),
|
sl@0
|
50 |
iLogonAO(NULL), iThreadPriority(static_cast<TThreadPriority>(KDefaultMMFControllerThreadPriority)), iFlags(0)
|
sl@0
|
51 |
{
|
sl@0
|
52 |
iSubThread.Close();//iSubThread is automatically initialised to be a handle to this thread!
|
sl@0
|
53 |
}
|
sl@0
|
54 |
|
sl@0
|
55 |
TInt RMMFControllerProxy::LoadController(
|
sl@0
|
56 |
TUid aControllerUid,
|
sl@0
|
57 |
const CMMFControllerImplementationInformation& aControllerInfo,
|
sl@0
|
58 |
TBool aUseSharedHeap,
|
sl@0
|
59 |
TBool aNoDRMCap)
|
sl@0
|
60 |
{
|
sl@0
|
61 |
// First check that we haven't already created the subthread
|
sl@0
|
62 |
if (iSubThread.Handle() != 0)
|
sl@0
|
63 |
return KErrAlreadyExists;
|
sl@0
|
64 |
|
sl@0
|
65 |
#ifdef SYMBIAN_FORCE_USE_SHARED_HEAP
|
sl@0
|
66 |
aUseSharedHeap = ETrue;
|
sl@0
|
67 |
#endif
|
sl@0
|
68 |
|
sl@0
|
69 |
//determine what maximum heap size this thread should be created with
|
sl@0
|
70 |
TUint maxHeapSize =0;
|
sl@0
|
71 |
TInt error = KErrNone;
|
sl@0
|
72 |
maxHeapSize = aControllerInfo.HeapSpaceRequired();
|
sl@0
|
73 |
TUint stackSize = aControllerInfo.StackSize();
|
sl@0
|
74 |
|
sl@0
|
75 |
ASSERT(!iLogonAO);
|
sl@0
|
76 |
TRAP(error, iLogonAO = CLogonMonitor::NewL(this));
|
sl@0
|
77 |
|
sl@0
|
78 |
if (!error)
|
sl@0
|
79 |
{
|
sl@0
|
80 |
if (aNoDRMCap && aControllerInfo.SupportsSecureDRMProcessMode())
|
sl@0
|
81 |
{
|
sl@0
|
82 |
error = DoCreateSessionForNoDRMCapClient(maxHeapSize, aUseSharedHeap, stackSize);
|
sl@0
|
83 |
}
|
sl@0
|
84 |
else
|
sl@0
|
85 |
{
|
sl@0
|
86 |
// server2 will be set in this function call
|
sl@0
|
87 |
error = DoCreateSubThread(&iLogonAO->Server(), maxHeapSize, aUseSharedHeap, stackSize);
|
sl@0
|
88 |
|
sl@0
|
89 |
// Now create a session with the controller proxy server running in the subthread
|
sl@0
|
90 |
if (!error)
|
sl@0
|
91 |
{
|
sl@0
|
92 |
// create a session with iServer2 (local server)
|
sl@0
|
93 |
error = CreateSession(iLogonAO->Server(), KMMFControllerProxyVersion);
|
sl@0
|
94 |
}
|
sl@0
|
95 |
}
|
sl@0
|
96 |
}
|
sl@0
|
97 |
|
sl@0
|
98 |
// Finally, tell the controller proxy server to load the relevant plugin
|
sl@0
|
99 |
if (!error)
|
sl@0
|
100 |
{
|
sl@0
|
101 |
TMMFUidPckg uidPckg(aControllerUid);
|
sl@0
|
102 |
error = SendSync(iDestinationPckg,
|
sl@0
|
103 |
EMMFControllerProxyLoadControllerPluginByUid,
|
sl@0
|
104 |
uidPckg,
|
sl@0
|
105 |
KNullDesC8);
|
sl@0
|
106 |
}
|
sl@0
|
107 |
|
sl@0
|
108 |
// If an error occurred with any of the above, close all the handles
|
sl@0
|
109 |
if (error)
|
sl@0
|
110 |
Close();
|
sl@0
|
111 |
|
sl@0
|
112 |
return error;
|
sl@0
|
113 |
}
|
sl@0
|
114 |
|
sl@0
|
115 |
|
sl@0
|
116 |
EXPORT_C TInt RMMFControllerProxy::LoadController(TUid aControllerUid, TBool aUseSharedHeap)
|
sl@0
|
117 |
{
|
sl@0
|
118 |
CMMFControllerImplementationInformation* controllerInfo = NULL;
|
sl@0
|
119 |
|
sl@0
|
120 |
TRAPD(err, controllerInfo = CMMFControllerImplementationInformation::NewL(aControllerUid));
|
sl@0
|
121 |
if (!err && controllerInfo)
|
sl@0
|
122 |
{
|
sl@0
|
123 |
err = LoadController(aControllerUid, *controllerInfo, aUseSharedHeap, EFalse);
|
sl@0
|
124 |
delete controllerInfo;
|
sl@0
|
125 |
}
|
sl@0
|
126 |
return err;
|
sl@0
|
127 |
}
|
sl@0
|
128 |
|
sl@0
|
129 |
EXPORT_C TInt RMMFControllerProxy::LoadController(const CMMFControllerImplementationInformation& aControllerInfo, TBool aUseSharedHeap)
|
sl@0
|
130 |
{
|
sl@0
|
131 |
return LoadController(aControllerInfo.Uid(), aControllerInfo, aUseSharedHeap, EFalse);
|
sl@0
|
132 |
}
|
sl@0
|
133 |
|
sl@0
|
134 |
EXPORT_C TInt RMMFControllerProxy::LoadControllerInSecureDRMProcess(TUid aControllerUid, TBool aUseSharedHeap)
|
sl@0
|
135 |
{
|
sl@0
|
136 |
CMMFControllerImplementationInformation* controllerInfo = NULL;
|
sl@0
|
137 |
|
sl@0
|
138 |
TRAPD(err, controllerInfo = CMMFControllerImplementationInformation::NewL(aControllerUid));
|
sl@0
|
139 |
if (!err && controllerInfo)
|
sl@0
|
140 |
{
|
sl@0
|
141 |
err = LoadController(aControllerUid, *controllerInfo, aUseSharedHeap, ETrue);
|
sl@0
|
142 |
delete controllerInfo;
|
sl@0
|
143 |
}
|
sl@0
|
144 |
return err;
|
sl@0
|
145 |
}
|
sl@0
|
146 |
|
sl@0
|
147 |
EXPORT_C TInt RMMFControllerProxy::LoadControllerInSecureDRMProcess(const CMMFControllerImplementationInformation& aControllerInfo, TBool aUseSharedHeap)
|
sl@0
|
148 |
{
|
sl@0
|
149 |
return LoadController(aControllerInfo.Uid(), aControllerInfo, aUseSharedHeap, ETrue);
|
sl@0
|
150 |
}
|
sl@0
|
151 |
|
sl@0
|
152 |
TUint RMMFControllerProxy::ControllersMaxHeapSizeL(TUid aControllerUid)
|
sl@0
|
153 |
{
|
sl@0
|
154 |
CMMFControllerImplementationInformation* controllerInfo = NULL;
|
sl@0
|
155 |
|
sl@0
|
156 |
TRAPD(err, controllerInfo = CMMFControllerImplementationInformation::NewL(aControllerUid));
|
sl@0
|
157 |
|
sl@0
|
158 |
|
sl@0
|
159 |
TUint maxHeapSize = KMMFDefaultControllerThreadHeapSize;
|
sl@0
|
160 |
|
sl@0
|
161 |
if((err != KErrNone) && (err != KErrCorrupt))
|
sl@0
|
162 |
{
|
sl@0
|
163 |
delete controllerInfo;
|
sl@0
|
164 |
User::Leave(err);
|
sl@0
|
165 |
}
|
sl@0
|
166 |
|
sl@0
|
167 |
|
sl@0
|
168 |
if(controllerInfo && (err == KErrNone))
|
sl@0
|
169 |
maxHeapSize = controllerInfo->HeapSpaceRequired();
|
sl@0
|
170 |
|
sl@0
|
171 |
delete controllerInfo;
|
sl@0
|
172 |
|
sl@0
|
173 |
return maxHeapSize;
|
sl@0
|
174 |
}
|
sl@0
|
175 |
|
sl@0
|
176 |
|
sl@0
|
177 |
TInt RMMFControllerProxy::DoCreateSubThread(RServer2* aServer2, TUint aMaxHeapSize, TBool aUseSharedHeap, TUint aStackSize)
|
sl@0
|
178 |
{
|
sl@0
|
179 |
TInt error = KErrNone;
|
sl@0
|
180 |
|
sl@0
|
181 |
TControllerProxyServerParams params;
|
sl@0
|
182 |
params.iServer = aServer2;
|
sl@0
|
183 |
params.iUsingSharedHeap = aUseSharedHeap;
|
sl@0
|
184 |
|
sl@0
|
185 |
#ifdef SYMBIAN_USE_CLIENT_HEAP
|
sl@0
|
186 |
// controller threads share the *client* heap (intended for out of memory testing)
|
sl@0
|
187 |
error = iSubThread.Create(_L(""), &CMMFControllerProxyServer::StartThread,
|
sl@0
|
188 |
aStackSize, NULL, ¶ms, EOwnerThread);
|
sl@0
|
189 |
#else
|
sl@0
|
190 |
if( aUseSharedHeap )
|
sl@0
|
191 |
{
|
sl@0
|
192 |
//controller threads all share a controller heap
|
sl@0
|
193 |
CMMFControllerHeap* contHeap = static_cast<CMMFControllerHeap*>(Dll::Tls());
|
sl@0
|
194 |
if(contHeap == NULL)
|
sl@0
|
195 |
{
|
sl@0
|
196 |
TRAP(error, contHeap = CMMFControllerHeap::NewL());
|
sl@0
|
197 |
if(error)
|
sl@0
|
198 |
{
|
sl@0
|
199 |
return error;
|
sl@0
|
200 |
}
|
sl@0
|
201 |
|
sl@0
|
202 |
Dll::SetTls(contHeap);
|
sl@0
|
203 |
}
|
sl@0
|
204 |
|
sl@0
|
205 |
__ASSERT_DEBUG((iFlags&EFlagOpenedSharedHeap)==0, Panic(EPanicHeapHalfOpen));
|
sl@0
|
206 |
|
sl@0
|
207 |
RHeap* sharedHeap = contHeap->RegisterHeap();
|
sl@0
|
208 |
// We've registered, so record the fact so can "unregister" on close or error
|
sl@0
|
209 |
iFlags |= EFlagOpenedSharedHeap;
|
sl@0
|
210 |
|
sl@0
|
211 |
error = iSubThread.Create(KNullDesC, &CMMFControllerProxyServer::StartThread,
|
sl@0
|
212 |
aStackSize, sharedHeap,
|
sl@0
|
213 |
¶ms, EOwnerThread);
|
sl@0
|
214 |
}
|
sl@0
|
215 |
else
|
sl@0
|
216 |
{
|
sl@0
|
217 |
// Threads create own heap (default behaviour)
|
sl@0
|
218 |
if(aMaxHeapSize < static_cast<TUint>(KMinHeapSize))
|
sl@0
|
219 |
aMaxHeapSize = KMinHeapSize; //else raises a USER 111 panic
|
sl@0
|
220 |
else if(aMaxHeapSize > static_cast<TUint>(KMMFControllerProxyMaxHeapSize))
|
sl@0
|
221 |
aMaxHeapSize = KMMFControllerProxyMaxHeapSize;
|
sl@0
|
222 |
|
sl@0
|
223 |
TThreadCreateInfo threadSettings (KNullDesC, &CMMFControllerProxyServer::StartThread,
|
sl@0
|
224 |
aStackSize, ¶ms);
|
sl@0
|
225 |
threadSettings.SetCreateHeap(KMinHeapSize, aMaxHeapSize);
|
sl@0
|
226 |
threadSettings.SetOwner(EOwnerThread);
|
sl@0
|
227 |
threadSettings.SetPaging(TThreadCreateInfo::EUnpaged);
|
sl@0
|
228 |
|
sl@0
|
229 |
error = iSubThread.Create(threadSettings);
|
sl@0
|
230 |
}
|
sl@0
|
231 |
#endif
|
sl@0
|
232 |
|
sl@0
|
233 |
if (error)
|
sl@0
|
234 |
{
|
sl@0
|
235 |
return error;
|
sl@0
|
236 |
}
|
sl@0
|
237 |
|
sl@0
|
238 |
TRequestStatus rendezvous;
|
sl@0
|
239 |
iSubThread.Rendezvous(rendezvous);
|
sl@0
|
240 |
if (rendezvous != KRequestPending)
|
sl@0
|
241 |
{
|
sl@0
|
242 |
iSubThread.Kill(0);
|
sl@0
|
243 |
}
|
sl@0
|
244 |
else
|
sl@0
|
245 |
{
|
sl@0
|
246 |
iLogonAO->StartMonitoring(iSubThread);
|
sl@0
|
247 |
if (iLogonAO->iStatus != KRequestPending)
|
sl@0
|
248 |
{
|
sl@0
|
249 |
// Failed to logon
|
sl@0
|
250 |
iSubThread.RendezvousCancel(rendezvous);
|
sl@0
|
251 |
User::WaitForRequest(rendezvous);
|
sl@0
|
252 |
iSubThread.Kill(0);
|
sl@0
|
253 |
iSubThread.Close();
|
sl@0
|
254 |
return iLogonAO->iStatus.Int();
|
sl@0
|
255 |
}
|
sl@0
|
256 |
else
|
sl@0
|
257 |
{
|
sl@0
|
258 |
iSubThread.SetPriority(iThreadPriority);
|
sl@0
|
259 |
iSubThread.Resume();
|
sl@0
|
260 |
}
|
sl@0
|
261 |
}
|
sl@0
|
262 |
|
sl@0
|
263 |
User::WaitForRequest(rendezvous); // wait for startup or death
|
sl@0
|
264 |
|
sl@0
|
265 |
if (rendezvous != KErrNone)
|
sl@0
|
266 |
{
|
sl@0
|
267 |
iLogonAO->Cancel();
|
sl@0
|
268 |
iSubThread.Close();
|
sl@0
|
269 |
// if open failed, but we registered the heap, need to release
|
sl@0
|
270 |
if((iFlags&EFlagOpenedSharedHeap))
|
sl@0
|
271 |
{
|
sl@0
|
272 |
ReleaseHeap();
|
sl@0
|
273 |
}
|
sl@0
|
274 |
}
|
sl@0
|
275 |
|
sl@0
|
276 |
return rendezvous.Int();
|
sl@0
|
277 |
}
|
sl@0
|
278 |
|
sl@0
|
279 |
EXPORT_C void RMMFControllerProxy::Close()
|
sl@0
|
280 |
{
|
sl@0
|
281 |
#ifdef _DEBUG
|
sl@0
|
282 |
_LIT(KMMFClientThreadPanic, "MMFClientThread");
|
sl@0
|
283 |
#endif
|
sl@0
|
284 |
// check if thread was created
|
sl@0
|
285 |
TBool subThreadCreated = EFalse;
|
sl@0
|
286 |
TRequestStatus logoffStatus;
|
sl@0
|
287 |
TBool logoffFailed = EFalse;
|
sl@0
|
288 |
if (iSubThread.Handle() != KNullHandle)
|
sl@0
|
289 |
{
|
sl@0
|
290 |
subThreadCreated = ETrue;
|
sl@0
|
291 |
iLogonAO->Cancel();
|
sl@0
|
292 |
iSubThread.Logon(logoffStatus);
|
sl@0
|
293 |
|
sl@0
|
294 |
if (logoffStatus == KErrNoMemory && iSubThread.ExitType() == EExitPending)
|
sl@0
|
295 |
{
|
sl@0
|
296 |
// Logon() call has failed because of a lack of memory
|
sl@0
|
297 |
logoffFailed = ETrue;
|
sl@0
|
298 |
}
|
sl@0
|
299 |
}
|
sl@0
|
300 |
|
sl@0
|
301 |
// Close the controller and wait for its exit.
|
sl@0
|
302 |
// Close the session to signal the controller proxy server to shut down.
|
sl@0
|
303 |
RHandleBase::Close();
|
sl@0
|
304 |
|
sl@0
|
305 |
// Now wait for the death of the subthread if we have a valid handle...
|
sl@0
|
306 |
if (subThreadCreated)
|
sl@0
|
307 |
{
|
sl@0
|
308 |
RProcess thisProcess;
|
sl@0
|
309 |
RProcess controllerProcess;
|
sl@0
|
310 |
iSubThread.Process(controllerProcess); // ignore error, best try
|
sl@0
|
311 |
TBool secureDrmMode = thisProcess.Id() != controllerProcess.Id();
|
sl@0
|
312 |
thisProcess.Close();
|
sl@0
|
313 |
controllerProcess.Close();
|
sl@0
|
314 |
|
sl@0
|
315 |
RTimer timer;
|
sl@0
|
316 |
TInt err = timer.CreateLocal();
|
sl@0
|
317 |
// If we managed to create the timer and logon to the thread,
|
sl@0
|
318 |
// wait for both the death and the timeout to minimise the risk of deadlock
|
sl@0
|
319 |
if (!err && !logoffFailed)
|
sl@0
|
320 |
{
|
sl@0
|
321 |
TRequestStatus timeout;
|
sl@0
|
322 |
timer.After(timeout, KMmfControllerThreadShutdownTimeout);
|
sl@0
|
323 |
User::WaitForRequest(logoffStatus, timeout);
|
sl@0
|
324 |
if (logoffStatus == KRequestPending)
|
sl@0
|
325 |
{
|
sl@0
|
326 |
// we have timed out. Kill the controller thread
|
sl@0
|
327 |
iSubThread.LogonCancel(logoffStatus);
|
sl@0
|
328 |
User::WaitForRequest(logoffStatus);
|
sl@0
|
329 |
|
sl@0
|
330 |
if (!secureDrmMode)
|
sl@0
|
331 |
{
|
sl@0
|
332 |
// Controller server thread is created in current process
|
sl@0
|
333 |
#ifdef _DEBUG
|
sl@0
|
334 |
iSubThread.Panic(KMMFClientThreadPanic,KErrDied);
|
sl@0
|
335 |
#else
|
sl@0
|
336 |
iSubThread.Kill(KErrDied);
|
sl@0
|
337 |
#endif
|
sl@0
|
338 |
}
|
sl@0
|
339 |
else
|
sl@0
|
340 |
{
|
sl@0
|
341 |
// Controller server thread is created through DRM plugin server
|
sl@0
|
342 |
RMMFDRMPluginServerProxy server;
|
sl@0
|
343 |
// ignore all RMMFDRMPluginServerProxy errors, best try
|
sl@0
|
344 |
err = server.Open();
|
sl@0
|
345 |
if (err == KErrNone)
|
sl@0
|
346 |
{
|
sl@0
|
347 |
#ifdef _DEBUG
|
sl@0
|
348 |
server.PanicControllerThread(iSubThread.Id(), KMMFClientThreadPanic, KErrDied);
|
sl@0
|
349 |
#else
|
sl@0
|
350 |
server.KillControllerThread(iSubThread.Id(), KErrDied);
|
sl@0
|
351 |
#endif
|
sl@0
|
352 |
server.Close();
|
sl@0
|
353 |
}
|
sl@0
|
354 |
}
|
sl@0
|
355 |
}
|
sl@0
|
356 |
else
|
sl@0
|
357 |
{
|
sl@0
|
358 |
// subthread has exited. Cancel the timer.
|
sl@0
|
359 |
timer.Cancel();
|
sl@0
|
360 |
User::WaitForRequest(timeout);
|
sl@0
|
361 |
}
|
sl@0
|
362 |
}
|
sl@0
|
363 |
else
|
sl@0
|
364 |
{
|
sl@0
|
365 |
// We have no timer or we can't logon to the thread so we'll just poll the thread status a maximum
|
sl@0
|
366 |
// of 10 times and kill the thread if it hasn't exited after the polling
|
sl@0
|
367 |
for (TInt i=0; i<10 && iSubThread.ExitType() == EExitPending; ++i)
|
sl@0
|
368 |
{
|
sl@0
|
369 |
User::After(KMmfControllerThreadShutdownTimeout/10); // wait for a while
|
sl@0
|
370 |
}
|
sl@0
|
371 |
|
sl@0
|
372 |
if (iSubThread.ExitType() == EExitPending)
|
sl@0
|
373 |
{
|
sl@0
|
374 |
// The polling hasn't been succesful so we kill the thread
|
sl@0
|
375 |
if (!secureDrmMode)
|
sl@0
|
376 |
{
|
sl@0
|
377 |
iSubThread.Kill(KErrDied);
|
sl@0
|
378 |
}
|
sl@0
|
379 |
else
|
sl@0
|
380 |
{
|
sl@0
|
381 |
// Controller server thread is created through DRM plugin server
|
sl@0
|
382 |
RMMFDRMPluginServerProxy server;
|
sl@0
|
383 |
// ignore all RMMFDRMPluginServerProxy errors, best try
|
sl@0
|
384 |
err = server.Open();
|
sl@0
|
385 |
if (err == KErrNone)
|
sl@0
|
386 |
{
|
sl@0
|
387 |
server.KillControllerThread(iSubThread.Id(), KErrDied);
|
sl@0
|
388 |
}
|
sl@0
|
389 |
}
|
sl@0
|
390 |
}
|
sl@0
|
391 |
|
sl@0
|
392 |
User::WaitForRequest(logoffStatus);
|
sl@0
|
393 |
}
|
sl@0
|
394 |
timer.Close();
|
sl@0
|
395 |
}
|
sl@0
|
396 |
|
sl@0
|
397 |
// Close the handle to the controller thread
|
sl@0
|
398 |
iSubThread.Close();
|
sl@0
|
399 |
// Delete the Logon AO
|
sl@0
|
400 |
if (iLogonAO)
|
sl@0
|
401 |
{
|
sl@0
|
402 |
delete iLogonAO;
|
sl@0
|
403 |
iLogonAO = NULL;
|
sl@0
|
404 |
}
|
sl@0
|
405 |
// if this is last thread to be killed delete shared heap
|
sl@0
|
406 |
if((iFlags&EFlagOpenedSharedHeap))
|
sl@0
|
407 |
{
|
sl@0
|
408 |
ReleaseHeap();
|
sl@0
|
409 |
}
|
sl@0
|
410 |
}
|
sl@0
|
411 |
|
sl@0
|
412 |
// Release the shared heap, should only be called if has previously been registered
|
sl@0
|
413 |
// by this thread
|
sl@0
|
414 |
void RMMFControllerProxy::ReleaseHeap()
|
sl@0
|
415 |
{
|
sl@0
|
416 |
__ASSERT_DEBUG((iFlags&EFlagOpenedSharedHeap), Panic(EPanicReleaseWithoutRegister));
|
sl@0
|
417 |
|
sl@0
|
418 |
CMMFControllerHeap* contHeap = static_cast<CMMFControllerHeap*>(Dll::Tls());
|
sl@0
|
419 |
__ASSERT_DEBUG(contHeap!=NULL, Panic(EPanicHeapOpenWithoutTls));
|
sl@0
|
420 |
|
sl@0
|
421 |
if(contHeap != NULL)
|
sl@0
|
422 |
{
|
sl@0
|
423 |
TInt refCount = contHeap->ReleaseHeap();
|
sl@0
|
424 |
if(refCount == 0)
|
sl@0
|
425 |
{ //no other controllers using the heap
|
sl@0
|
426 |
delete contHeap;
|
sl@0
|
427 |
Dll::SetTls(NULL);
|
sl@0
|
428 |
}
|
sl@0
|
429 |
}
|
sl@0
|
430 |
|
sl@0
|
431 |
iFlags &= ~EFlagOpenedSharedHeap; // clear flag since we've released the heap
|
sl@0
|
432 |
}
|
sl@0
|
433 |
|
sl@0
|
434 |
EXPORT_C TInt RMMFControllerProxy::SendSync(const TMMFMessageDestinationPckg& aDestination, TInt aFunction, const TDesC8& aDataTo1, const TDesC8& aDataTo2, TDes8& aDataFrom) const
|
sl@0
|
435 |
{
|
sl@0
|
436 |
// Make sure we have been opened
|
sl@0
|
437 |
if (iSubThread.Handle() == 0)
|
sl@0
|
438 |
{
|
sl@0
|
439 |
return KErrNotReady;
|
sl@0
|
440 |
}
|
sl@0
|
441 |
else
|
sl@0
|
442 |
return SendReceiveResult(aFunction, aDestination, aDataTo1, aDataTo2, aDataFrom);
|
sl@0
|
443 |
}
|
sl@0
|
444 |
|
sl@0
|
445 |
|
sl@0
|
446 |
EXPORT_C TInt RMMFControllerProxy::SendSync(TInt aFunction, const TIpcArgs& aIpcArgs) const
|
sl@0
|
447 |
{
|
sl@0
|
448 |
// Make sure we have been opened
|
sl@0
|
449 |
if (iSubThread.Handle() == 0)
|
sl@0
|
450 |
{
|
sl@0
|
451 |
return KErrNotReady;
|
sl@0
|
452 |
}
|
sl@0
|
453 |
else
|
sl@0
|
454 |
return RSessionBase::SendReceive(aFunction, aIpcArgs);
|
sl@0
|
455 |
}
|
sl@0
|
456 |
|
sl@0
|
457 |
EXPORT_C void RMMFControllerProxy::SendAsync(TInt aFunction, const TIpcArgs& aIpcArgs, TRequestStatus& aStatus) const
|
sl@0
|
458 |
{
|
sl@0
|
459 |
// Make sure we have been opened
|
sl@0
|
460 |
if (iSubThread.Handle() == 0)
|
sl@0
|
461 |
{
|
sl@0
|
462 |
TRequestStatus* status = &aStatus;
|
sl@0
|
463 |
User::RequestComplete(status, KErrNotReady);
|
sl@0
|
464 |
}
|
sl@0
|
465 |
else
|
sl@0
|
466 |
RSessionBase::SendReceive(aFunction, aIpcArgs, aStatus);
|
sl@0
|
467 |
}
|
sl@0
|
468 |
|
sl@0
|
469 |
|
sl@0
|
470 |
|
sl@0
|
471 |
EXPORT_C TInt RMMFControllerProxy::SendSync(const TMMFMessageDestinationPckg& aDestination, TInt aFunction, const TDesC8& aDataTo1, const TDesC8& aDataTo2) const
|
sl@0
|
472 |
{
|
sl@0
|
473 |
// Make sure we have been opened
|
sl@0
|
474 |
if (iSubThread.Handle() == 0)
|
sl@0
|
475 |
{
|
sl@0
|
476 |
return KErrNotReady;
|
sl@0
|
477 |
}
|
sl@0
|
478 |
else
|
sl@0
|
479 |
return SendReceive(aFunction, aDestination, aDataTo1, aDataTo2);
|
sl@0
|
480 |
}
|
sl@0
|
481 |
|
sl@0
|
482 |
EXPORT_C void RMMFControllerProxy::SendAsync(const TMMFMessageDestinationPckg& aDestination, TInt aFunction, const TDesC8& aDataTo1, const TDesC8& aDataTo2, TDes8& aDataFrom, TRequestStatus& aStatus) const
|
sl@0
|
483 |
{
|
sl@0
|
484 |
if (iSubThread.Handle() == 0)
|
sl@0
|
485 |
{
|
sl@0
|
486 |
TRequestStatus* stat = &aStatus;
|
sl@0
|
487 |
User::RequestComplete(stat, KErrNotReady);
|
sl@0
|
488 |
}
|
sl@0
|
489 |
else
|
sl@0
|
490 |
SendReceiveResult(aFunction, aDestination, aDataTo1, aDataTo2, aDataFrom, aStatus);
|
sl@0
|
491 |
}
|
sl@0
|
492 |
|
sl@0
|
493 |
EXPORT_C void RMMFControllerProxy::SendAsync(const TMMFMessageDestinationPckg& aDestination, TInt aFunction, const TDesC8& aDataTo1, const TDesC8& aDataTo2, TRequestStatus& aStatus) const
|
sl@0
|
494 |
{
|
sl@0
|
495 |
if (iSubThread.Handle() == 0)
|
sl@0
|
496 |
{
|
sl@0
|
497 |
TRequestStatus* stat = &aStatus;
|
sl@0
|
498 |
User::RequestComplete(stat, KErrNotReady);
|
sl@0
|
499 |
}
|
sl@0
|
500 |
else
|
sl@0
|
501 |
SendReceive(aFunction, aDestination, aDataTo1, aDataTo2, aStatus);
|
sl@0
|
502 |
}
|
sl@0
|
503 |
|
sl@0
|
504 |
EXPORT_C void RMMFControllerProxy::ReceiveEvents(TMMFEventPckg& aEvent, TRequestStatus& aStatus)
|
sl@0
|
505 |
{
|
sl@0
|
506 |
SendAsync(iDestinationPckg, EMMFControllerProxyReceiveEvents, KNullDesC8, KNullDesC8, aEvent, aStatus);
|
sl@0
|
507 |
}
|
sl@0
|
508 |
|
sl@0
|
509 |
EXPORT_C TInt RMMFControllerProxy::CancelReceiveEvents()
|
sl@0
|
510 |
{
|
sl@0
|
511 |
return SendSync(iDestinationPckg, EMMFControllerProxyCancelReceiveEvents, KNullDesC8, KNullDesC8);
|
sl@0
|
512 |
}
|
sl@0
|
513 |
|
sl@0
|
514 |
EXPORT_C TInt RMMFControllerProxy::SetThreadPriority(const TThreadPriority& aPriority) const
|
sl@0
|
515 |
{
|
sl@0
|
516 |
TInt err = KErrNone;
|
sl@0
|
517 |
|
sl@0
|
518 |
if (iSubThread.Handle() == 0)
|
sl@0
|
519 |
{
|
sl@0
|
520 |
err = KErrNotReady;
|
sl@0
|
521 |
}
|
sl@0
|
522 |
else
|
sl@0
|
523 |
{
|
sl@0
|
524 |
if (iThreadPriority != aPriority)
|
sl@0
|
525 |
{
|
sl@0
|
526 |
// This is a const method so cast it away to store the priority
|
sl@0
|
527 |
RMMFControllerProxy* nonConstThis = const_cast<RMMFControllerProxy*>(this);
|
sl@0
|
528 |
nonConstThis->iThreadPriority = aPriority;
|
sl@0
|
529 |
}
|
sl@0
|
530 |
|
sl@0
|
531 |
// check controller thread creation location
|
sl@0
|
532 |
RProcess thisProcess;
|
sl@0
|
533 |
RProcess controllerProcess;
|
sl@0
|
534 |
err = iSubThread.Process(controllerProcess);
|
sl@0
|
535 |
|
sl@0
|
536 |
if (err == KErrNone)
|
sl@0
|
537 |
{
|
sl@0
|
538 |
if (thisProcess.Id() == controllerProcess.Id())
|
sl@0
|
539 |
{
|
sl@0
|
540 |
// Controller server thread is created in current process
|
sl@0
|
541 |
if (iSubThread.Priority() != iThreadPriority)
|
sl@0
|
542 |
{
|
sl@0
|
543 |
iSubThread.Suspend();
|
sl@0
|
544 |
iSubThread.SetPriority(iThreadPriority);
|
sl@0
|
545 |
iSubThread.Resume();
|
sl@0
|
546 |
}
|
sl@0
|
547 |
}
|
sl@0
|
548 |
else
|
sl@0
|
549 |
{
|
sl@0
|
550 |
// Controller server thread is created through DRM plugin server
|
sl@0
|
551 |
RMMFDRMPluginServerProxy server;
|
sl@0
|
552 |
err = server.Open();
|
sl@0
|
553 |
if (err == KErrNone)
|
sl@0
|
554 |
{
|
sl@0
|
555 |
err = server.SetThreadPriority(iSubThread.Id(), iThreadPriority);
|
sl@0
|
556 |
server.Close();
|
sl@0
|
557 |
}
|
sl@0
|
558 |
}
|
sl@0
|
559 |
}
|
sl@0
|
560 |
thisProcess.Close();
|
sl@0
|
561 |
controllerProcess.Close();
|
sl@0
|
562 |
}
|
sl@0
|
563 |
return err;
|
sl@0
|
564 |
}
|
sl@0
|
565 |
|
sl@0
|
566 |
void RMMFControllerProxy::ThreadTerminated()
|
sl@0
|
567 |
{
|
sl@0
|
568 |
// The controller subthread has died and the controller should be closed
|
sl@0
|
569 |
iSubThread.Close();
|
sl@0
|
570 |
}
|
sl@0
|
571 |
|
sl@0
|
572 |
TInt RMMFControllerProxy::DoCreateSessionForNoDRMCapClient(TUint aMaxHeapSize, TBool aUseSharedHeap, TUint aStackSize)
|
sl@0
|
573 |
{
|
sl@0
|
574 |
TThreadId tid;
|
sl@0
|
575 |
RMMFDRMPluginServerProxy server;
|
sl@0
|
576 |
TInt error = server.Open();
|
sl@0
|
577 |
|
sl@0
|
578 |
if(!error)
|
sl@0
|
579 |
{
|
sl@0
|
580 |
error = server.LaunchControllerServer(aMaxHeapSize, aUseSharedHeap, tid, aStackSize);
|
sl@0
|
581 |
}
|
sl@0
|
582 |
if(!error)
|
sl@0
|
583 |
{
|
sl@0
|
584 |
error = iSubThread.Open(tid, EOwnerThread);
|
sl@0
|
585 |
if(!error)
|
sl@0
|
586 |
{
|
sl@0
|
587 |
iLogonAO->StartMonitoring(iSubThread);
|
sl@0
|
588 |
if (iLogonAO->iStatus != KRequestPending)
|
sl@0
|
589 |
{
|
sl@0
|
590 |
// Failed to logon
|
sl@0
|
591 |
server.KillControllerThread(tid, 0);
|
sl@0
|
592 |
iSubThread.Close();
|
sl@0
|
593 |
error = iLogonAO->iStatus.Int();
|
sl@0
|
594 |
}
|
sl@0
|
595 |
}
|
sl@0
|
596 |
else
|
sl@0
|
597 |
{
|
sl@0
|
598 |
// Failed to open thread handle
|
sl@0
|
599 |
server.KillControllerThread(tid, 0);
|
sl@0
|
600 |
}
|
sl@0
|
601 |
}
|
sl@0
|
602 |
if(!error)
|
sl@0
|
603 |
{
|
sl@0
|
604 |
error = server.SetThreadPriority(tid, iThreadPriority);
|
sl@0
|
605 |
if(!error)
|
sl@0
|
606 |
{
|
sl@0
|
607 |
error = SetReturnedHandle(server.GetControllerSessionHandle());
|
sl@0
|
608 |
}
|
sl@0
|
609 |
if(error)
|
sl@0
|
610 |
{
|
sl@0
|
611 |
// Failed to create session with controller
|
sl@0
|
612 |
iLogonAO->Cancel();
|
sl@0
|
613 |
server.KillControllerThread(tid, 0);
|
sl@0
|
614 |
iSubThread.Close();
|
sl@0
|
615 |
}
|
sl@0
|
616 |
}
|
sl@0
|
617 |
server.Close();
|
sl@0
|
618 |
return error;
|
sl@0
|
619 |
}
|
sl@0
|
620 |
|
sl@0
|
621 |
|
sl@0
|
622 |
// RMMFCustomCommandsBase
|
sl@0
|
623 |
|
sl@0
|
624 |
/**
|
sl@0
|
625 |
Constructor.
|
sl@0
|
626 |
|
sl@0
|
627 |
@param aController
|
sl@0
|
628 |
A reference to the controller client class that will be used to send
|
sl@0
|
629 |
custom commands to the controller plugin.
|
sl@0
|
630 |
@param aInterfaceId
|
sl@0
|
631 |
The UID of the custom command interface that is provided by this client
|
sl@0
|
632 |
API class.
|
sl@0
|
633 |
|
sl@0
|
634 |
@since 7.0s
|
sl@0
|
635 |
*/
|
sl@0
|
636 |
EXPORT_C RMMFCustomCommandsBase::RMMFCustomCommandsBase(RMMFController& aController, TUid aInterfaceId)
|
sl@0
|
637 |
: iController(aController), iDestinationPckg(aInterfaceId)
|
sl@0
|
638 |
{
|
sl@0
|
639 |
}
|
sl@0
|
640 |
|
sl@0
|
641 |
|
sl@0
|
642 |
// TMMFMessageDestination
|
sl@0
|
643 |
EXPORT_C TMMFMessageDestination::TMMFMessageDestination()
|
sl@0
|
644 |
: iInterfaceId(KNullUid), iDestinationHandle(KMMFObjectHandleController)
|
sl@0
|
645 |
{
|
sl@0
|
646 |
}
|
sl@0
|
647 |
|
sl@0
|
648 |
EXPORT_C TMMFMessageDestination::TMMFMessageDestination(TUid aInterfaceId)
|
sl@0
|
649 |
: iInterfaceId(aInterfaceId), iDestinationHandle(KMMFObjectHandleController)
|
sl@0
|
650 |
{
|
sl@0
|
651 |
}
|
sl@0
|
652 |
|
sl@0
|
653 |
EXPORT_C TMMFMessageDestination::TMMFMessageDestination(TUid aInterfaceId, TInt aDestinationHandle)
|
sl@0
|
654 |
: iInterfaceId(aInterfaceId), iDestinationHandle(aDestinationHandle)
|
sl@0
|
655 |
{
|
sl@0
|
656 |
}
|
sl@0
|
657 |
|
sl@0
|
658 |
EXPORT_C TMMFMessageDestination::TMMFMessageDestination(const TMMFMessageDestination& aOther)
|
sl@0
|
659 |
: iInterfaceId(aOther.iInterfaceId), iDestinationHandle(aOther.iDestinationHandle)
|
sl@0
|
660 |
{
|
sl@0
|
661 |
}
|
sl@0
|
662 |
|
sl@0
|
663 |
EXPORT_C TUid TMMFMessageDestination::InterfaceId() const
|
sl@0
|
664 |
{
|
sl@0
|
665 |
return iInterfaceId;
|
sl@0
|
666 |
}
|
sl@0
|
667 |
|
sl@0
|
668 |
EXPORT_C TInt TMMFMessageDestination::DestinationHandle() const
|
sl@0
|
669 |
{
|
sl@0
|
670 |
return iDestinationHandle;
|
sl@0
|
671 |
}
|
sl@0
|
672 |
|
sl@0
|
673 |
EXPORT_C TBool TMMFMessageDestination::operator==(const TMMFMessageDestination& aOther) const
|
sl@0
|
674 |
{
|
sl@0
|
675 |
return ((iInterfaceId==aOther.iInterfaceId) && (iDestinationHandle==aOther.iDestinationHandle));
|
sl@0
|
676 |
}
|
sl@0
|
677 |
|
sl@0
|
678 |
|
sl@0
|
679 |
|
sl@0
|
680 |
// CMMFControllerProxySession
|
sl@0
|
681 |
CMMFControllerProxySession* CMMFControllerProxySession::NewL()
|
sl@0
|
682 |
{
|
sl@0
|
683 |
CMMFControllerProxySession* s = new(ELeave) CMMFControllerProxySession;
|
sl@0
|
684 |
return s;
|
sl@0
|
685 |
}
|
sl@0
|
686 |
|
sl@0
|
687 |
void CMMFControllerProxySession::CreateL(const CMmfIpcServer& aServer)
|
sl@0
|
688 |
{
|
sl@0
|
689 |
CMmfIpcSession::CreateL(aServer);
|
sl@0
|
690 |
iServer = STATIC_CAST(CMMFControllerProxyServer*, (CONST_CAST(CMmfIpcServer*, &aServer)));
|
sl@0
|
691 |
iServer->SessionCreated();
|
sl@0
|
692 |
}
|
sl@0
|
693 |
|
sl@0
|
694 |
CMMFControllerProxySession::~CMMFControllerProxySession()
|
sl@0
|
695 |
{
|
sl@0
|
696 |
delete iController;
|
sl@0
|
697 |
delete iEventReceiver;
|
sl@0
|
698 |
iEvents.Close();
|
sl@0
|
699 |
iServer->SessionDestroyed();
|
sl@0
|
700 |
}
|
sl@0
|
701 |
|
sl@0
|
702 |
|
sl@0
|
703 |
|
sl@0
|
704 |
void CMMFControllerProxySession::ServiceL(const RMmfIpcMessage& aMessage)
|
sl@0
|
705 |
{
|
sl@0
|
706 |
TMMFMessage message(aMessage);
|
sl@0
|
707 |
// Get the destination info from the client.
|
sl@0
|
708 |
message.FetchDestinationL();
|
sl@0
|
709 |
|
sl@0
|
710 |
if (message.Destination().InterfaceId() == KUidInterfaceMMFControllerProxy)
|
sl@0
|
711 |
{
|
sl@0
|
712 |
// Message for controller proxy so decode here
|
sl@0
|
713 |
TBool complete = EFalse;
|
sl@0
|
714 |
switch (message.Function())
|
sl@0
|
715 |
{
|
sl@0
|
716 |
case EMMFControllerProxyReceiveEvents:
|
sl@0
|
717 |
complete = ReceiveEventsL(message);
|
sl@0
|
718 |
break;
|
sl@0
|
719 |
case EMMFControllerProxyCancelReceiveEvents:
|
sl@0
|
720 |
complete = CancelReceiveEvents(message);
|
sl@0
|
721 |
break;
|
sl@0
|
722 |
case EMMFControllerProxyLoadControllerPluginByUid:
|
sl@0
|
723 |
complete = LoadControllerL(message);
|
sl@0
|
724 |
break;
|
sl@0
|
725 |
default:
|
sl@0
|
726 |
User::Leave(KErrNotSupported);
|
sl@0
|
727 |
}
|
sl@0
|
728 |
if (complete)
|
sl@0
|
729 |
message.Complete(KErrNone);
|
sl@0
|
730 |
}
|
sl@0
|
731 |
else
|
sl@0
|
732 |
{
|
sl@0
|
733 |
// Message for controller so forward on to controller baseclass
|
sl@0
|
734 |
if (iController)
|
sl@0
|
735 |
iController->HandleRequestL(message);
|
sl@0
|
736 |
else
|
sl@0
|
737 |
User::Leave(KErrNotReady);
|
sl@0
|
738 |
}
|
sl@0
|
739 |
}
|
sl@0
|
740 |
|
sl@0
|
741 |
CMMFControllerProxySession::CMMFControllerProxySession()
|
sl@0
|
742 |
{
|
sl@0
|
743 |
}
|
sl@0
|
744 |
|
sl@0
|
745 |
TBool CMMFControllerProxySession::ReceiveEventsL(TMMFMessage& aMessage)
|
sl@0
|
746 |
{
|
sl@0
|
747 |
if (iEventReceiver)
|
sl@0
|
748 |
User::Leave(KErrAlreadyExists);
|
sl@0
|
749 |
iEventReceiver = CMMFEventReceiver::NewL(aMessage);
|
sl@0
|
750 |
//send the next cached event (if any) to the client
|
sl@0
|
751 |
if (iEvents.Count() > 0)
|
sl@0
|
752 |
{
|
sl@0
|
753 |
TMMFEvent& event = iEvents[0];
|
sl@0
|
754 |
iEventReceiver->SendEvent(event);
|
sl@0
|
755 |
delete iEventReceiver;
|
sl@0
|
756 |
iEventReceiver=NULL;
|
sl@0
|
757 |
iEvents.Remove(0);
|
sl@0
|
758 |
}
|
sl@0
|
759 |
return EFalse;
|
sl@0
|
760 |
}
|
sl@0
|
761 |
|
sl@0
|
762 |
TBool CMMFControllerProxySession::CancelReceiveEvents(TMMFMessage& /*aMessage*/)
|
sl@0
|
763 |
{
|
sl@0
|
764 |
delete iEventReceiver;
|
sl@0
|
765 |
iEventReceiver = NULL;
|
sl@0
|
766 |
return ETrue;
|
sl@0
|
767 |
}
|
sl@0
|
768 |
|
sl@0
|
769 |
TInt CMMFControllerProxySession::SendEventToClient(const TMMFEvent& aEvent)
|
sl@0
|
770 |
{
|
sl@0
|
771 |
TInt error = KErrNone;
|
sl@0
|
772 |
if (iEventReceiver)
|
sl@0
|
773 |
{
|
sl@0
|
774 |
//send event to client now
|
sl@0
|
775 |
iEventReceiver->SendEvent(aEvent);
|
sl@0
|
776 |
delete iEventReceiver;
|
sl@0
|
777 |
iEventReceiver=NULL;
|
sl@0
|
778 |
error = KErrNone;
|
sl@0
|
779 |
}
|
sl@0
|
780 |
else
|
sl@0
|
781 |
{
|
sl@0
|
782 |
//queue the request for later
|
sl@0
|
783 |
TMMFEvent event(aEvent);
|
sl@0
|
784 |
//if we've exceeded the max number of cached messages, delete the first and append this one to the end
|
sl@0
|
785 |
if (iEvents.Count() >= KMMFControllerProxyMaxCachedMessages)
|
sl@0
|
786 |
iEvents.Remove(0);
|
sl@0
|
787 |
error = iEvents.Append(event);
|
sl@0
|
788 |
}
|
sl@0
|
789 |
return error;
|
sl@0
|
790 |
}
|
sl@0
|
791 |
|
sl@0
|
792 |
TBool CMMFControllerProxySession::LoadControllerL(TMMFMessage& aMessage)
|
sl@0
|
793 |
{
|
sl@0
|
794 |
TMMFUidPckg pckg;
|
sl@0
|
795 |
aMessage.ReadData1FromClientL(pckg);
|
sl@0
|
796 |
|
sl@0
|
797 |
RThread clientThread;
|
sl@0
|
798 |
aMessage.iMessage.ClientL(clientThread);
|
sl@0
|
799 |
CleanupClosePushL(clientThread);
|
sl@0
|
800 |
iController = CMMFController::NewL(pckg(), *this, clientThread.Id());
|
sl@0
|
801 |
CleanupStack::PopAndDestroy(&clientThread);
|
sl@0
|
802 |
return ETrue;
|
sl@0
|
803 |
}
|
sl@0
|
804 |
|
sl@0
|
805 |
|
sl@0
|
806 |
|
sl@0
|
807 |
CMMFControllerProxyServer* CMMFControllerProxyServer::NewL(RServer2* aServer2)
|
sl@0
|
808 |
{
|
sl@0
|
809 |
CMMFControllerProxyServer* s = new(ELeave) CMMFControllerProxyServer();
|
sl@0
|
810 |
CleanupStack::PushL(s);
|
sl@0
|
811 |
s->ConstructL(aServer2);
|
sl@0
|
812 |
CleanupStack::Pop(s);
|
sl@0
|
813 |
return s;
|
sl@0
|
814 |
}
|
sl@0
|
815 |
|
sl@0
|
816 |
CMMFControllerProxyServer::CMMFControllerProxyServer() :
|
sl@0
|
817 |
CMmfIpcServer(EPriorityStandard, EGlobalSharableSessions)
|
sl@0
|
818 |
{
|
sl@0
|
819 |
}
|
sl@0
|
820 |
|
sl@0
|
821 |
void CMMFControllerProxyServer::ConstructL(RServer2* aServer2)
|
sl@0
|
822 |
{
|
sl@0
|
823 |
SetPinClientDescriptors(ETrue);
|
sl@0
|
824 |
|
sl@0
|
825 |
StartL(KNullDesC);
|
sl@0
|
826 |
*aServer2 = CServer2::Server();
|
sl@0
|
827 |
|
sl@0
|
828 |
iShutdownTimer = CMMFControllerProxyShutdown::NewL();
|
sl@0
|
829 |
iShutdownTimer->Start();
|
sl@0
|
830 |
}
|
sl@0
|
831 |
|
sl@0
|
832 |
CMMFControllerProxyServer::~CMMFControllerProxyServer()
|
sl@0
|
833 |
{
|
sl@0
|
834 |
delete iShutdownTimer;
|
sl@0
|
835 |
}
|
sl@0
|
836 |
|
sl@0
|
837 |
EXPORT_C TInt CMMFControllerProxyServer::StartThread(TAny* aParam)
|
sl@0
|
838 |
{
|
sl@0
|
839 |
TInt err = KErrNone;
|
sl@0
|
840 |
//create cleanupstack
|
sl@0
|
841 |
CTrapCleanup* cleanup=CTrapCleanup::New(); // get clean-up stack
|
sl@0
|
842 |
if (!cleanup)
|
sl@0
|
843 |
err = KErrNoMemory;
|
sl@0
|
844 |
if (!err)
|
sl@0
|
845 |
{
|
sl@0
|
846 |
TRAP(err, DoStartThreadL(aParam));
|
sl@0
|
847 |
}
|
sl@0
|
848 |
delete cleanup;
|
sl@0
|
849 |
return err;
|
sl@0
|
850 |
}
|
sl@0
|
851 |
|
sl@0
|
852 |
void CMMFControllerProxyServer::RenameControllerProxyThread()
|
sl@0
|
853 |
{
|
sl@0
|
854 |
RThread thread;
|
sl@0
|
855 |
TThreadId threadId;
|
sl@0
|
856 |
TName name;
|
sl@0
|
857 |
name.Append(KMMFControllerProxyServerName);
|
sl@0
|
858 |
threadId = thread.Id();
|
sl@0
|
859 |
name.AppendNum(threadId.Id(),EHex);
|
sl@0
|
860 |
User::RenameThread(name);
|
sl@0
|
861 |
}
|
sl@0
|
862 |
|
sl@0
|
863 |
void CMMFControllerProxyServer::DoStartThreadL(TAny* aParam)
|
sl@0
|
864 |
{
|
sl@0
|
865 |
TControllerProxyServerParams* params = static_cast<TControllerProxyServerParams*>(aParam);
|
sl@0
|
866 |
|
sl@0
|
867 |
//Rename Current thread to unique name
|
sl@0
|
868 |
RenameControllerProxyThread();
|
sl@0
|
869 |
|
sl@0
|
870 |
#ifndef SYMBIAN_USE_CLIENT_HEAP
|
sl@0
|
871 |
TBool usingSharedHeap = params->iUsingSharedHeap; // take copy since params invalid after Rendezvous
|
sl@0
|
872 |
|
sl@0
|
873 |
if( ! usingSharedHeap )
|
sl@0
|
874 |
{
|
sl@0
|
875 |
__UHEAP_MARK;
|
sl@0
|
876 |
}
|
sl@0
|
877 |
|
sl@0
|
878 |
#endif
|
sl@0
|
879 |
// create and install the active scheduler we need
|
sl@0
|
880 |
CActiveScheduler* s=new(ELeave) CActiveScheduler;
|
sl@0
|
881 |
CleanupStack::PushL(s);
|
sl@0
|
882 |
CActiveScheduler::Install(s);
|
sl@0
|
883 |
// create the server (leave it on the cleanup stack)
|
sl@0
|
884 |
CleanupStack::PushL(CMMFControllerProxyServer::NewL( params->iServer ) );
|
sl@0
|
885 |
// Initialisation complete, now signal the client
|
sl@0
|
886 |
RThread::Rendezvous(KErrNone);
|
sl@0
|
887 |
// Ready to run
|
sl@0
|
888 |
CActiveScheduler::Start();
|
sl@0
|
889 |
|
sl@0
|
890 |
REComSession::FinalClose();
|
sl@0
|
891 |
|
sl@0
|
892 |
// Cleanup the server and scheduler
|
sl@0
|
893 |
CleanupStack::PopAndDestroy(2, s);
|
sl@0
|
894 |
#ifndef SYMBIAN_USE_CLIENT_HEAP
|
sl@0
|
895 |
if( ! usingSharedHeap )
|
sl@0
|
896 |
{
|
sl@0
|
897 |
__UHEAP_MARKEND;
|
sl@0
|
898 |
}
|
sl@0
|
899 |
#endif
|
sl@0
|
900 |
}
|
sl@0
|
901 |
|
sl@0
|
902 |
TInt CMMFControllerProxyServer::RunError(TInt aError)
|
sl@0
|
903 |
{
|
sl@0
|
904 |
// Send error to the client
|
sl@0
|
905 |
Message().Complete(aError);
|
sl@0
|
906 |
ReStart();
|
sl@0
|
907 |
return KErrNone;
|
sl@0
|
908 |
}
|
sl@0
|
909 |
|
sl@0
|
910 |
CMmfIpcSession* CMMFControllerProxyServer::NewSessionL(const TVersion& aVersion) const
|
sl@0
|
911 |
{
|
sl@0
|
912 |
// Only one session is allowed to connect to us
|
sl@0
|
913 |
if (iHaveSession)
|
sl@0
|
914 |
User::Leave(KErrAlreadyExists);
|
sl@0
|
915 |
// Check that the version number of the client is correct
|
sl@0
|
916 |
if (!User::QueryVersionSupported(KMMFControllerProxyVersion, aVersion))
|
sl@0
|
917 |
User::Leave(KErrNotSupported);
|
sl@0
|
918 |
|
sl@0
|
919 |
return CMMFControllerProxySession::NewL();
|
sl@0
|
920 |
}
|
sl@0
|
921 |
|
sl@0
|
922 |
void CMMFControllerProxyServer::SessionCreated()
|
sl@0
|
923 |
{
|
sl@0
|
924 |
iHaveSession = ETrue;
|
sl@0
|
925 |
// Stop the shutdown timer
|
sl@0
|
926 |
iShutdownTimer->Cancel();
|
sl@0
|
927 |
}
|
sl@0
|
928 |
|
sl@0
|
929 |
void CMMFControllerProxyServer::SessionDestroyed()
|
sl@0
|
930 |
{
|
sl@0
|
931 |
// Need to shut down
|
sl@0
|
932 |
iShutdownTimer->ShutdownNow();
|
sl@0
|
933 |
}
|
sl@0
|
934 |
|
sl@0
|
935 |
CMMFControllerProxyShutdown* CMMFControllerProxyShutdown::NewL()
|
sl@0
|
936 |
{
|
sl@0
|
937 |
CMMFControllerProxyShutdown* s = new(ELeave) CMMFControllerProxyShutdown();
|
sl@0
|
938 |
CleanupStack::PushL(s);
|
sl@0
|
939 |
s->ConstructL();
|
sl@0
|
940 |
CleanupStack::Pop(s);
|
sl@0
|
941 |
return s;
|
sl@0
|
942 |
}
|
sl@0
|
943 |
|
sl@0
|
944 |
CMMFControllerProxyShutdown::CMMFControllerProxyShutdown() :
|
sl@0
|
945 |
CTimer(EPriorityLow)
|
sl@0
|
946 |
{
|
sl@0
|
947 |
CActiveScheduler::Add(this);
|
sl@0
|
948 |
}
|
sl@0
|
949 |
|
sl@0
|
950 |
void CMMFControllerProxyShutdown::ConstructL()
|
sl@0
|
951 |
{
|
sl@0
|
952 |
CTimer::ConstructL();
|
sl@0
|
953 |
}
|
sl@0
|
954 |
|
sl@0
|
955 |
void CMMFControllerProxyShutdown::Start()
|
sl@0
|
956 |
{
|
sl@0
|
957 |
After(EMMFControllerProxyShutdownDelay);
|
sl@0
|
958 |
}
|
sl@0
|
959 |
|
sl@0
|
960 |
void CMMFControllerProxyShutdown::RunL()
|
sl@0
|
961 |
{
|
sl@0
|
962 |
ShutdownNow();
|
sl@0
|
963 |
}
|
sl@0
|
964 |
|
sl@0
|
965 |
void CMMFControllerProxyShutdown::ShutdownNow()
|
sl@0
|
966 |
{
|
sl@0
|
967 |
CActiveScheduler::Stop();
|
sl@0
|
968 |
}
|
sl@0
|
969 |
|
sl@0
|
970 |
|
sl@0
|
971 |
|
sl@0
|
972 |
|
sl@0
|
973 |
|
sl@0
|
974 |
|
sl@0
|
975 |
|
sl@0
|
976 |
CMMFEventReceiver* CMMFEventReceiver::NewL(const TMMFMessage& aMessage)
|
sl@0
|
977 |
{
|
sl@0
|
978 |
return new(ELeave) CMMFEventReceiver(aMessage);
|
sl@0
|
979 |
}
|
sl@0
|
980 |
|
sl@0
|
981 |
CMMFEventReceiver::~CMMFEventReceiver()
|
sl@0
|
982 |
{
|
sl@0
|
983 |
if (!(iMessage.IsCompleted()))
|
sl@0
|
984 |
iMessage.Complete(KErrDied);
|
sl@0
|
985 |
}
|
sl@0
|
986 |
|
sl@0
|
987 |
void CMMFEventReceiver::SendEvent(const TMMFEvent& aEvent)
|
sl@0
|
988 |
{
|
sl@0
|
989 |
TMMFEventPckg eventpckg(aEvent);
|
sl@0
|
990 |
TInt err = iMessage.WriteDataToClient(eventpckg);
|
sl@0
|
991 |
iMessage.Complete(err);
|
sl@0
|
992 |
}
|
sl@0
|
993 |
|
sl@0
|
994 |
CMMFEventReceiver::CMMFEventReceiver(const TMMFMessage& aMessage) : iMessage(aMessage)
|
sl@0
|
995 |
{
|
sl@0
|
996 |
}
|
sl@0
|
997 |
|
sl@0
|
998 |
|
sl@0
|
999 |
|
sl@0
|
1000 |
// TMMFMessage
|
sl@0
|
1001 |
EXPORT_C TMMFMessage::TMMFMessage(const TMMFMessage& aMessage) :
|
sl@0
|
1002 |
iMessage(aMessage.iMessage),
|
sl@0
|
1003 |
#ifdef __MMF_USE_IPC_V2__
|
sl@0
|
1004 |
iFunction(aMessage.iFunction),
|
sl@0
|
1005 |
#endif // __MMF_USE_IPC_V2__
|
sl@0
|
1006 |
iDestination(aMessage.iDestination),
|
sl@0
|
1007 |
iAmCompleted(aMessage.iAmCompleted)
|
sl@0
|
1008 |
{
|
sl@0
|
1009 |
}
|
sl@0
|
1010 |
|
sl@0
|
1011 |
EXPORT_C const TMMFMessageDestination& TMMFMessage::Destination()
|
sl@0
|
1012 |
{
|
sl@0
|
1013 |
return iDestination;
|
sl@0
|
1014 |
}
|
sl@0
|
1015 |
|
sl@0
|
1016 |
EXPORT_C TInt TMMFMessage::Function()
|
sl@0
|
1017 |
{
|
sl@0
|
1018 |
#ifdef __MMF_USE_IPC_V2__
|
sl@0
|
1019 |
return iFunction;
|
sl@0
|
1020 |
#else
|
sl@0
|
1021 |
return iMessage.Function();
|
sl@0
|
1022 |
#endif // __MMF_USE_IPC_V2__
|
sl@0
|
1023 |
}
|
sl@0
|
1024 |
|
sl@0
|
1025 |
EXPORT_C TInt TMMFMessage::SizeOfData1FromClient()
|
sl@0
|
1026 |
{
|
sl@0
|
1027 |
#ifdef __MMF_USE_IPC_V2__
|
sl@0
|
1028 |
return iMessage.GetDesLength(1);
|
sl@0
|
1029 |
#else
|
sl@0
|
1030 |
return iMessage.Client().GetDesLength(iMessage.Ptr1());
|
sl@0
|
1031 |
#endif // __MMF_USE_IPC_V2__
|
sl@0
|
1032 |
}
|
sl@0
|
1033 |
|
sl@0
|
1034 |
EXPORT_C void TMMFMessage::ReadData1FromClientL(TDes8& aDes)
|
sl@0
|
1035 |
{
|
sl@0
|
1036 |
#ifdef __MMF_USE_IPC_V2__
|
sl@0
|
1037 |
iMessage.ReadL(1, aDes);
|
sl@0
|
1038 |
#else
|
sl@0
|
1039 |
iMessage.ReadL(iMessage.Ptr1(), aDes);
|
sl@0
|
1040 |
#endif // __MMF_USE_IPC_V2__
|
sl@0
|
1041 |
}
|
sl@0
|
1042 |
|
sl@0
|
1043 |
EXPORT_C TInt TMMFMessage::ReadData1FromClient(TDes8& aDes)
|
sl@0
|
1044 |
{
|
sl@0
|
1045 |
TRAPD(err, ReadData1FromClientL(aDes));
|
sl@0
|
1046 |
return err;
|
sl@0
|
1047 |
}
|
sl@0
|
1048 |
|
sl@0
|
1049 |
EXPORT_C TInt TMMFMessage::SizeOfData2FromClient()
|
sl@0
|
1050 |
{
|
sl@0
|
1051 |
#ifdef __MMF_USE_IPC_V2__
|
sl@0
|
1052 |
return iMessage.GetDesLength(2);
|
sl@0
|
1053 |
#else
|
sl@0
|
1054 |
return iMessage.Client().GetDesLength(iMessage.Ptr2());
|
sl@0
|
1055 |
#endif // __MMF_USE_IPC_V2__
|
sl@0
|
1056 |
}
|
sl@0
|
1057 |
|
sl@0
|
1058 |
EXPORT_C void TMMFMessage::ReadData2FromClientL(TDes8& aDes)
|
sl@0
|
1059 |
{
|
sl@0
|
1060 |
#ifdef __MMF_USE_IPC_V2__
|
sl@0
|
1061 |
iMessage.ReadL(2, aDes);
|
sl@0
|
1062 |
#else
|
sl@0
|
1063 |
iMessage.ReadL(iMessage.Ptr2(), aDes);
|
sl@0
|
1064 |
#endif // __MMF_USE_IPC_V2__
|
sl@0
|
1065 |
}
|
sl@0
|
1066 |
|
sl@0
|
1067 |
EXPORT_C TInt TMMFMessage::ReadData2FromClient(TDes8& aDes)
|
sl@0
|
1068 |
{
|
sl@0
|
1069 |
TRAPD(err, ReadData2FromClientL(aDes));
|
sl@0
|
1070 |
return err;
|
sl@0
|
1071 |
}
|
sl@0
|
1072 |
|
sl@0
|
1073 |
EXPORT_C void TMMFMessage::WriteDataToClientL(const TDesC8& aDes)
|
sl@0
|
1074 |
{
|
sl@0
|
1075 |
#ifdef __MMF_USE_IPC_V2__
|
sl@0
|
1076 |
iMessage.WriteL(3, aDes);
|
sl@0
|
1077 |
#else
|
sl@0
|
1078 |
iMessage.WriteL(iMessage.Ptr3(), aDes);
|
sl@0
|
1079 |
#endif // __MMF_USE_IPC_V2__
|
sl@0
|
1080 |
}
|
sl@0
|
1081 |
|
sl@0
|
1082 |
EXPORT_C TInt TMMFMessage::WriteDataToClient(const TDesC8& aDes)
|
sl@0
|
1083 |
{
|
sl@0
|
1084 |
TRAPD(err, WriteDataToClientL(aDes));
|
sl@0
|
1085 |
return err;
|
sl@0
|
1086 |
}
|
sl@0
|
1087 |
|
sl@0
|
1088 |
EXPORT_C void TMMFMessage::Complete(TInt aReason)
|
sl@0
|
1089 |
{
|
sl@0
|
1090 |
iMessage.Complete(aReason);
|
sl@0
|
1091 |
iAmCompleted = ETrue;
|
sl@0
|
1092 |
}
|
sl@0
|
1093 |
|
sl@0
|
1094 |
EXPORT_C TBool TMMFMessage::IsCompleted()
|
sl@0
|
1095 |
{
|
sl@0
|
1096 |
return iAmCompleted;
|
sl@0
|
1097 |
}
|
sl@0
|
1098 |
|
sl@0
|
1099 |
EXPORT_C void TMMFMessage::AdoptFileHandleFromClientL(TInt aFsHandleIndex, TInt aFileHandleIndex, RFile& aFile)
|
sl@0
|
1100 |
{
|
sl@0
|
1101 |
User::LeaveIfError(aFile.AdoptFromClient(RMessage2(iMessage) , aFsHandleIndex, aFileHandleIndex));
|
sl@0
|
1102 |
}
|
sl@0
|
1103 |
|
sl@0
|
1104 |
EXPORT_C TMMFMessage::TMMFMessage(const RMmfIpcMessage& aMessage) :
|
sl@0
|
1105 |
iMessage(aMessage),
|
sl@0
|
1106 |
#ifdef __MMF_USE_IPC_V2__
|
sl@0
|
1107 |
iFunction(aMessage.Function()),
|
sl@0
|
1108 |
#endif // __MMF_USE_IPC_V2__
|
sl@0
|
1109 |
iAmCompleted(EFalse)
|
sl@0
|
1110 |
{
|
sl@0
|
1111 |
}
|
sl@0
|
1112 |
|
sl@0
|
1113 |
EXPORT_C void TMMFMessage::FetchDestinationL()
|
sl@0
|
1114 |
{
|
sl@0
|
1115 |
// Read the destination info from the client
|
sl@0
|
1116 |
TMMFMessageDestinationPckg pckg;
|
sl@0
|
1117 |
#ifdef __MMF_USE_IPC_V2__
|
sl@0
|
1118 |
iMessage.ReadL(0, pckg);
|
sl@0
|
1119 |
#else
|
sl@0
|
1120 |
iMessage.ReadL(iMessage.Ptr0(), pckg);
|
sl@0
|
1121 |
#endif // __MMF_USE_IPC_V2__
|
sl@0
|
1122 |
iDestination = pckg();
|
sl@0
|
1123 |
}
|
sl@0
|
1124 |
|
sl@0
|
1125 |
|
sl@0
|
1126 |
// CMMFObject
|
sl@0
|
1127 |
|
sl@0
|
1128 |
/**
|
sl@0
|
1129 |
Constructor.
|
sl@0
|
1130 |
|
sl@0
|
1131 |
@param aInterfaceId
|
sl@0
|
1132 |
The UID of the interface provided by this object.
|
sl@0
|
1133 |
@since 7.0s
|
sl@0
|
1134 |
*/
|
sl@0
|
1135 |
EXPORT_C CMMFObject::CMMFObject(TUid aInterfaceId)
|
sl@0
|
1136 |
: iHandle(aInterfaceId, KMMFObjectHandleNull)
|
sl@0
|
1137 |
{
|
sl@0
|
1138 |
}
|
sl@0
|
1139 |
|
sl@0
|
1140 |
/**
|
sl@0
|
1141 |
Destructor.
|
sl@0
|
1142 |
*/
|
sl@0
|
1143 |
EXPORT_C CMMFObject::~CMMFObject()
|
sl@0
|
1144 |
{
|
sl@0
|
1145 |
}
|
sl@0
|
1146 |
|
sl@0
|
1147 |
/**
|
sl@0
|
1148 |
Returns the handle of the object.
|
sl@0
|
1149 |
|
sl@0
|
1150 |
@return The handle of this object.
|
sl@0
|
1151 |
|
sl@0
|
1152 |
@since 7.0s
|
sl@0
|
1153 |
*/
|
sl@0
|
1154 |
EXPORT_C const TMMFMessageDestination& CMMFObject::Handle()
|
sl@0
|
1155 |
{
|
sl@0
|
1156 |
return iHandle;
|
sl@0
|
1157 |
}
|
sl@0
|
1158 |
|
sl@0
|
1159 |
/**
|
sl@0
|
1160 |
Compares two CMMFObjects by comparing their handles.
|
sl@0
|
1161 |
|
sl@0
|
1162 |
@param aOther
|
sl@0
|
1163 |
The object to be compared with this object.
|
sl@0
|
1164 |
|
sl@0
|
1165 |
@return A boolean indicating if the two CMMFObjects are the same. ETrue if they are the same,
|
sl@0
|
1166 |
EFalse if the objects are different.
|
sl@0
|
1167 |
@since 7.0s
|
sl@0
|
1168 |
*/
|
sl@0
|
1169 |
EXPORT_C TBool CMMFObject::operator==(const CMMFObject& aOther)
|
sl@0
|
1170 |
{
|
sl@0
|
1171 |
return (iHandle==aOther.iHandle);
|
sl@0
|
1172 |
}
|
sl@0
|
1173 |
|
sl@0
|
1174 |
void CMMFObject::SetHandle(const TMMFMessageDestination& aNewHandle)
|
sl@0
|
1175 |
{
|
sl@0
|
1176 |
iHandle = aNewHandle;
|
sl@0
|
1177 |
}
|
sl@0
|
1178 |
|
sl@0
|
1179 |
|
sl@0
|
1180 |
// CMMFDataSourceHolder
|
sl@0
|
1181 |
|
sl@0
|
1182 |
/**
|
sl@0
|
1183 |
Constructor.
|
sl@0
|
1184 |
|
sl@0
|
1185 |
@param aDataSource
|
sl@0
|
1186 |
The data source to be wrapped.
|
sl@0
|
1187 |
|
sl@0
|
1188 |
@since 7.0s
|
sl@0
|
1189 |
*/
|
sl@0
|
1190 |
EXPORT_C CMMFDataSourceHolder::CMMFDataSourceHolder(MDataSource& aDataSource)
|
sl@0
|
1191 |
: CMMFObject(KUidInterfaceMMFDataSourceHolder), iDataSource(&aDataSource)
|
sl@0
|
1192 |
{
|
sl@0
|
1193 |
}
|
sl@0
|
1194 |
|
sl@0
|
1195 |
/**
|
sl@0
|
1196 |
Destructor.
|
sl@0
|
1197 |
|
sl@0
|
1198 |
Note: This deletes the data source.
|
sl@0
|
1199 |
|
sl@0
|
1200 |
@since 7.0s
|
sl@0
|
1201 |
*/
|
sl@0
|
1202 |
EXPORT_C CMMFDataSourceHolder::~CMMFDataSourceHolder()
|
sl@0
|
1203 |
{
|
sl@0
|
1204 |
delete iDataSource;
|
sl@0
|
1205 |
}
|
sl@0
|
1206 |
|
sl@0
|
1207 |
/**
|
sl@0
|
1208 |
Returns a reference to the data source.
|
sl@0
|
1209 |
|
sl@0
|
1210 |
@return The data source.
|
sl@0
|
1211 |
|
sl@0
|
1212 |
@since 7.0s
|
sl@0
|
1213 |
*/
|
sl@0
|
1214 |
EXPORT_C MDataSource& CMMFDataSourceHolder::DataSource()
|
sl@0
|
1215 |
{
|
sl@0
|
1216 |
return *iDataSource;
|
sl@0
|
1217 |
}
|
sl@0
|
1218 |
|
sl@0
|
1219 |
/**
|
sl@0
|
1220 |
Implementation of the pure virtual function inherited from CMMFObject.
|
sl@0
|
1221 |
|
sl@0
|
1222 |
Passes the request directly to the data source.
|
sl@0
|
1223 |
|
sl@0
|
1224 |
@param aMessage
|
sl@0
|
1225 |
The message to be handled.
|
sl@0
|
1226 |
|
sl@0
|
1227 |
@since 7.0s
|
sl@0
|
1228 |
*/
|
sl@0
|
1229 |
EXPORT_C void CMMFDataSourceHolder::HandleRequest(TMMFMessage& aMessage)
|
sl@0
|
1230 |
{
|
sl@0
|
1231 |
iDataSource->SourceCustomCommand(aMessage);
|
sl@0
|
1232 |
}
|
sl@0
|
1233 |
|
sl@0
|
1234 |
|
sl@0
|
1235 |
// CMMFDataSinkHolder
|
sl@0
|
1236 |
|
sl@0
|
1237 |
/**
|
sl@0
|
1238 |
Constructor.
|
sl@0
|
1239 |
|
sl@0
|
1240 |
@param aDataSink
|
sl@0
|
1241 |
The data sink to be wrapped.
|
sl@0
|
1242 |
@since 7.0s
|
sl@0
|
1243 |
*/
|
sl@0
|
1244 |
EXPORT_C CMMFDataSinkHolder::CMMFDataSinkHolder(MDataSink& aDataSink)
|
sl@0
|
1245 |
: CMMFObject(KUidInterfaceMMFDataSinkHolder), iDataSink(&aDataSink)
|
sl@0
|
1246 |
{
|
sl@0
|
1247 |
}
|
sl@0
|
1248 |
|
sl@0
|
1249 |
/**
|
sl@0
|
1250 |
Destructor.
|
sl@0
|
1251 |
|
sl@0
|
1252 |
Note: This deletes the data sink.
|
sl@0
|
1253 |
|
sl@0
|
1254 |
@since 7.0s
|
sl@0
|
1255 |
*/
|
sl@0
|
1256 |
EXPORT_C CMMFDataSinkHolder::~CMMFDataSinkHolder()
|
sl@0
|
1257 |
{
|
sl@0
|
1258 |
delete iDataSink;
|
sl@0
|
1259 |
}
|
sl@0
|
1260 |
|
sl@0
|
1261 |
/**
|
sl@0
|
1262 |
Returns a reference to the data sink.
|
sl@0
|
1263 |
|
sl@0
|
1264 |
@return The data sink.
|
sl@0
|
1265 |
@since 7.0s
|
sl@0
|
1266 |
*/
|
sl@0
|
1267 |
EXPORT_C MDataSink& CMMFDataSinkHolder::DataSink()
|
sl@0
|
1268 |
{
|
sl@0
|
1269 |
return *iDataSink;
|
sl@0
|
1270 |
}
|
sl@0
|
1271 |
|
sl@0
|
1272 |
/**
|
sl@0
|
1273 |
Implementation of the pure virtual function inherited from CMMFObject.
|
sl@0
|
1274 |
|
sl@0
|
1275 |
Passes the request directly to the data sink.
|
sl@0
|
1276 |
|
sl@0
|
1277 |
@param aMessage
|
sl@0
|
1278 |
The message to be handled.
|
sl@0
|
1279 |
|
sl@0
|
1280 |
@since 7.0s
|
sl@0
|
1281 |
*/
|
sl@0
|
1282 |
EXPORT_C void CMMFDataSinkHolder::HandleRequest(TMMFMessage& aMessage)
|
sl@0
|
1283 |
{
|
sl@0
|
1284 |
iDataSink->SinkCustomCommand(aMessage);
|
sl@0
|
1285 |
}
|
sl@0
|
1286 |
|
sl@0
|
1287 |
|
sl@0
|
1288 |
// CMMFCustomCommandParserBase
|
sl@0
|
1289 |
EXPORT_C TUid CMMFCustomCommandParserBase::InterfaceId()
|
sl@0
|
1290 |
{
|
sl@0
|
1291 |
return iInterfaceId;
|
sl@0
|
1292 |
}
|
sl@0
|
1293 |
|
sl@0
|
1294 |
EXPORT_C CMMFCustomCommandParserBase::~CMMFCustomCommandParserBase()
|
sl@0
|
1295 |
{
|
sl@0
|
1296 |
}
|
sl@0
|
1297 |
|
sl@0
|
1298 |
EXPORT_C CMMFCustomCommandParserBase::CMMFCustomCommandParserBase(TUid aInterfaceId)
|
sl@0
|
1299 |
: iInterfaceId(aInterfaceId)
|
sl@0
|
1300 |
{
|
sl@0
|
1301 |
}
|
sl@0
|
1302 |
|
sl@0
|
1303 |
|
sl@0
|
1304 |
// CMMFObjectContainer
|
sl@0
|
1305 |
|
sl@0
|
1306 |
/**
|
sl@0
|
1307 |
Constructor.
|
sl@0
|
1308 |
|
sl@0
|
1309 |
@since 7.0s
|
sl@0
|
1310 |
*/
|
sl@0
|
1311 |
EXPORT_C CMMFObjectContainer::CMMFObjectContainer()
|
sl@0
|
1312 |
{
|
sl@0
|
1313 |
iNextObjectHandle = KMMFObjectHandleFirstValid;
|
sl@0
|
1314 |
}
|
sl@0
|
1315 |
|
sl@0
|
1316 |
/**
|
sl@0
|
1317 |
Destructor.
|
sl@0
|
1318 |
|
sl@0
|
1319 |
Deletes all objects owned by the container.
|
sl@0
|
1320 |
|
sl@0
|
1321 |
@since 7.0s
|
sl@0
|
1322 |
*/
|
sl@0
|
1323 |
EXPORT_C CMMFObjectContainer::~CMMFObjectContainer()
|
sl@0
|
1324 |
{
|
sl@0
|
1325 |
iObjects.ResetAndDestroy();
|
sl@0
|
1326 |
iObjects.Close();
|
sl@0
|
1327 |
}
|
sl@0
|
1328 |
|
sl@0
|
1329 |
/**
|
sl@0
|
1330 |
Add an object to the container.
|
sl@0
|
1331 |
|
sl@0
|
1332 |
Once the object has been added, its ownership is transferred to the container.
|
sl@0
|
1333 |
|
sl@0
|
1334 |
@param aObject
|
sl@0
|
1335 |
A reference to the object to be added to the container.
|
sl@0
|
1336 |
|
sl@0
|
1337 |
@return An error code indicating if the function call was successful. If the return code is not KErrNone, then
|
sl@0
|
1338 |
ownership of the object still remains with the caller.
|
sl@0
|
1339 |
@since 7.0s
|
sl@0
|
1340 |
*/
|
sl@0
|
1341 |
EXPORT_C TInt CMMFObjectContainer::AddMMFObject(CMMFObject& aObject)
|
sl@0
|
1342 |
{
|
sl@0
|
1343 |
// Check the object isn't already added
|
sl@0
|
1344 |
if (aObject.Handle().DestinationHandle() != KMMFObjectHandleNull)
|
sl@0
|
1345 |
return KErrAlreadyExists;
|
sl@0
|
1346 |
|
sl@0
|
1347 |
TMMFMessageDestination newHandle(aObject.Handle().InterfaceId(), GenerateObjectHandle());
|
sl@0
|
1348 |
// Set the object's handle
|
sl@0
|
1349 |
aObject.SetHandle(newHandle);
|
sl@0
|
1350 |
// Append the object to the array
|
sl@0
|
1351 |
TInt error = iObjects.Append(&aObject);
|
sl@0
|
1352 |
// If error occurred, reset object handle to NULL
|
sl@0
|
1353 |
if (error)
|
sl@0
|
1354 |
{
|
sl@0
|
1355 |
TMMFMessageDestination evenNewerHandle(aObject.Handle().InterfaceId(), KMMFObjectHandleNull);
|
sl@0
|
1356 |
aObject.SetHandle(evenNewerHandle);
|
sl@0
|
1357 |
}
|
sl@0
|
1358 |
return error;
|
sl@0
|
1359 |
}
|
sl@0
|
1360 |
|
sl@0
|
1361 |
/**
|
sl@0
|
1362 |
Removes and destroys an object from the container.
|
sl@0
|
1363 |
|
sl@0
|
1364 |
This method ensures that the object is no longer in the container, and that it gets deleted.
|
sl@0
|
1365 |
Even if the object is not found in the container's array of objects, it will be deleted.
|
sl@0
|
1366 |
|
sl@0
|
1367 |
@param aObject
|
sl@0
|
1368 |
A reference to the object to be deleted.
|
sl@0
|
1369 |
|
sl@0
|
1370 |
@since 7.0s
|
sl@0
|
1371 |
*/
|
sl@0
|
1372 |
EXPORT_C void CMMFObjectContainer::RemoveAndDestroyMMFObject(CMMFObject& aObject)
|
sl@0
|
1373 |
{
|
sl@0
|
1374 |
TInt positionOfObjectInArray;
|
sl@0
|
1375 |
TInt error = FindMMFObject(aObject, positionOfObjectInArray);
|
sl@0
|
1376 |
if (!error)
|
sl@0
|
1377 |
{
|
sl@0
|
1378 |
iObjects.Remove(positionOfObjectInArray);
|
sl@0
|
1379 |
}
|
sl@0
|
1380 |
//else, we don't care since we're just saying we'll make sure the object
|
sl@0
|
1381 |
//isn't in the array, and that it gets deleted.
|
sl@0
|
1382 |
delete (&aObject);
|
sl@0
|
1383 |
}
|
sl@0
|
1384 |
|
sl@0
|
1385 |
/**
|
sl@0
|
1386 |
Removes and destroys all objects from the container.
|
sl@0
|
1387 |
|
sl@0
|
1388 |
@since 7.0s
|
sl@0
|
1389 |
*/
|
sl@0
|
1390 |
EXPORT_C void CMMFObjectContainer::DeleteAllObjects()
|
sl@0
|
1391 |
{
|
sl@0
|
1392 |
iObjects.ResetAndDestroy();
|
sl@0
|
1393 |
}
|
sl@0
|
1394 |
|
sl@0
|
1395 |
/**
|
sl@0
|
1396 |
Finds an object in the container using a handle.
|
sl@0
|
1397 |
|
sl@0
|
1398 |
@param aObjectHandle
|
sl@0
|
1399 |
The handle of the object to be located.
|
sl@0
|
1400 |
@param aObjectFound
|
sl@0
|
1401 |
A reference to a pointer to the object found in the container.
|
sl@0
|
1402 |
|
sl@0
|
1403 |
@return An error code indicating if the function call was successful. KErrNone on success, otherwise
|
sl@0
|
1404 |
another of the system-wide error codes.
|
sl@0
|
1405 |
@since 7.0s
|
sl@0
|
1406 |
*/
|
sl@0
|
1407 |
EXPORT_C TInt CMMFObjectContainer::FindMMFObject(const TMMFMessageDestination& aObjectHandle, CMMFObject*& aObjectFound)
|
sl@0
|
1408 |
{
|
sl@0
|
1409 |
// Need to find the appropriate object in the array of CMMFObjects
|
sl@0
|
1410 |
TInt error = KErrNotFound;
|
sl@0
|
1411 |
for (TInt i=0; i<iObjects.Count(); i++)
|
sl@0
|
1412 |
{
|
sl@0
|
1413 |
CMMFObject* obj = iObjects[i];
|
sl@0
|
1414 |
if (obj->Handle() == aObjectHandle)
|
sl@0
|
1415 |
{
|
sl@0
|
1416 |
error = KErrNone;
|
sl@0
|
1417 |
aObjectFound = obj;
|
sl@0
|
1418 |
break;
|
sl@0
|
1419 |
}
|
sl@0
|
1420 |
}
|
sl@0
|
1421 |
return error;
|
sl@0
|
1422 |
}
|
sl@0
|
1423 |
|
sl@0
|
1424 |
const RPointerArray<CMMFObject>& CMMFObjectContainer::MMFObjects()
|
sl@0
|
1425 |
{
|
sl@0
|
1426 |
return iObjects;
|
sl@0
|
1427 |
}
|
sl@0
|
1428 |
|
sl@0
|
1429 |
TInt CMMFObjectContainer::FindMMFObject(const CMMFObject& aObject, TInt& aPositionInArray)
|
sl@0
|
1430 |
{
|
sl@0
|
1431 |
TInt error = KErrNotFound;
|
sl@0
|
1432 |
for (TInt i=0; i<iObjects.Count(); i++)
|
sl@0
|
1433 |
{
|
sl@0
|
1434 |
CMMFObject* obj = iObjects[i];
|
sl@0
|
1435 |
if (*obj == aObject)
|
sl@0
|
1436 |
{
|
sl@0
|
1437 |
error = KErrNone;
|
sl@0
|
1438 |
aPositionInArray = i;
|
sl@0
|
1439 |
break;
|
sl@0
|
1440 |
}
|
sl@0
|
1441 |
}
|
sl@0
|
1442 |
return error;
|
sl@0
|
1443 |
}
|
sl@0
|
1444 |
|
sl@0
|
1445 |
TInt CMMFObjectContainer::GenerateObjectHandle()
|
sl@0
|
1446 |
{
|
sl@0
|
1447 |
return iNextObjectHandle++;
|
sl@0
|
1448 |
}
|
sl@0
|
1449 |
|
sl@0
|
1450 |
|
sl@0
|
1451 |
CLogonMonitor::CLogonMonitor(MLogonMonitorObserver* aLogonMonitorObserver)
|
sl@0
|
1452 |
: CActive(EPriorityStandard)
|
sl@0
|
1453 |
{
|
sl@0
|
1454 |
iLogonMonitorObserver = aLogonMonitorObserver;
|
sl@0
|
1455 |
}
|
sl@0
|
1456 |
|
sl@0
|
1457 |
void CLogonMonitor::ConstructL()
|
sl@0
|
1458 |
{
|
sl@0
|
1459 |
if (CActiveScheduler::Current()==0)
|
sl@0
|
1460 |
{
|
sl@0
|
1461 |
iScheduler = new (ELeave) CActiveScheduler;
|
sl@0
|
1462 |
CActiveScheduler::Install(iScheduler);
|
sl@0
|
1463 |
}
|
sl@0
|
1464 |
|
sl@0
|
1465 |
CActiveScheduler::Add(this);
|
sl@0
|
1466 |
}
|
sl@0
|
1467 |
|
sl@0
|
1468 |
CLogonMonitor* CLogonMonitor::NewL(MLogonMonitorObserver* aLogonMonitorObserver)
|
sl@0
|
1469 |
{
|
sl@0
|
1470 |
CLogonMonitor* self = new (ELeave) CLogonMonitor(aLogonMonitorObserver);
|
sl@0
|
1471 |
CleanupStack::PushL(self);
|
sl@0
|
1472 |
self->ConstructL();
|
sl@0
|
1473 |
CleanupStack::Pop(self);
|
sl@0
|
1474 |
return self;
|
sl@0
|
1475 |
}
|
sl@0
|
1476 |
|
sl@0
|
1477 |
CLogonMonitor::~CLogonMonitor()
|
sl@0
|
1478 |
{
|
sl@0
|
1479 |
Cancel();
|
sl@0
|
1480 |
|
sl@0
|
1481 |
if (iScheduler)
|
sl@0
|
1482 |
{
|
sl@0
|
1483 |
CActiveScheduler::Install(NULL);
|
sl@0
|
1484 |
delete iScheduler;
|
sl@0
|
1485 |
}
|
sl@0
|
1486 |
}
|
sl@0
|
1487 |
|
sl@0
|
1488 |
void CLogonMonitor::StartMonitoring(RThread& aThread)
|
sl@0
|
1489 |
{
|
sl@0
|
1490 |
ASSERT(!iThread);
|
sl@0
|
1491 |
|
sl@0
|
1492 |
iThread = &aThread;
|
sl@0
|
1493 |
iThread->Logon(iStatus);
|
sl@0
|
1494 |
SetActive();
|
sl@0
|
1495 |
}
|
sl@0
|
1496 |
|
sl@0
|
1497 |
void CLogonMonitor::RunL()
|
sl@0
|
1498 |
{
|
sl@0
|
1499 |
iServer.Close();
|
sl@0
|
1500 |
iLogonMonitorObserver->ThreadTerminated();
|
sl@0
|
1501 |
}
|
sl@0
|
1502 |
|
sl@0
|
1503 |
void CLogonMonitor::DoCancel()
|
sl@0
|
1504 |
{
|
sl@0
|
1505 |
ASSERT(iThread);
|
sl@0
|
1506 |
|
sl@0
|
1507 |
iThread->LogonCancel(iStatus);
|
sl@0
|
1508 |
iThread = NULL;
|
sl@0
|
1509 |
}
|
sl@0
|
1510 |
|
sl@0
|
1511 |
RServer2& CLogonMonitor::Server()
|
sl@0
|
1512 |
{
|
sl@0
|
1513 |
return iServer;
|
sl@0
|
1514 |
}
|
sl@0
|
1515 |
|
sl@0
|
1516 |
CMMFControllerExtendedData::CMMFControllerExtendedData()
|
sl@0
|
1517 |
: CMMFObject(KUidMMFControllerExtendedDataHolder), iSourceSinkInitData(NULL)
|
sl@0
|
1518 |
{
|
sl@0
|
1519 |
iClientThreadId = 0;
|
sl@0
|
1520 |
iSecureDrmMode = EFalse;
|
sl@0
|
1521 |
}
|
sl@0
|
1522 |
|
sl@0
|
1523 |
CMMFControllerExtendedData::~CMMFControllerExtendedData()
|
sl@0
|
1524 |
{
|
sl@0
|
1525 |
ResetSourceSinkInitData();
|
sl@0
|
1526 |
}
|
sl@0
|
1527 |
|
sl@0
|
1528 |
void CMMFControllerExtendedData::SetSourceSinkInitData(HBufC8* aSourceSinkInitData)
|
sl@0
|
1529 |
{
|
sl@0
|
1530 |
ResetSourceSinkInitData();
|
sl@0
|
1531 |
iSourceSinkInitData = aSourceSinkInitData;
|
sl@0
|
1532 |
}
|
sl@0
|
1533 |
|
sl@0
|
1534 |
HBufC8* CMMFControllerExtendedData::SourceSinkInitData() const
|
sl@0
|
1535 |
{
|
sl@0
|
1536 |
return iSourceSinkInitData;
|
sl@0
|
1537 |
}
|
sl@0
|
1538 |
|
sl@0
|
1539 |
void CMMFControllerExtendedData::ResetSourceSinkInitData()
|
sl@0
|
1540 |
{
|
sl@0
|
1541 |
if (iSourceSinkInitData)
|
sl@0
|
1542 |
{
|
sl@0
|
1543 |
delete iSourceSinkInitData;
|
sl@0
|
1544 |
iSourceSinkInitData = NULL;
|
sl@0
|
1545 |
}
|
sl@0
|
1546 |
}
|
sl@0
|
1547 |
|
sl@0
|
1548 |
void CMMFControllerExtendedData::SetClientThreadId(TThreadId aClientThreadId)
|
sl@0
|
1549 |
{
|
sl@0
|
1550 |
iClientThreadId = aClientThreadId;
|
sl@0
|
1551 |
}
|
sl@0
|
1552 |
|
sl@0
|
1553 |
TThreadId CMMFControllerExtendedData::ClientThreadId() const
|
sl@0
|
1554 |
{
|
sl@0
|
1555 |
return iClientThreadId;
|
sl@0
|
1556 |
}
|
sl@0
|
1557 |
|
sl@0
|
1558 |
void CMMFControllerExtendedData::SetSecureDrmMode(TBool aSecureDrmMode)
|
sl@0
|
1559 |
{
|
sl@0
|
1560 |
iSecureDrmMode = aSecureDrmMode;
|
sl@0
|
1561 |
}
|
sl@0
|
1562 |
|
sl@0
|
1563 |
TBool CMMFControllerExtendedData::SecureDrmMode() const
|
sl@0
|
1564 |
{
|
sl@0
|
1565 |
return iSecureDrmMode;
|
sl@0
|
1566 |
}
|
sl@0
|
1567 |
|
sl@0
|
1568 |
void CMMFControllerExtendedData::HandleRequest(TMMFMessage& /*aMessage*/)
|
sl@0
|
1569 |
{
|
sl@0
|
1570 |
// This function is not suppose to be called.
|
sl@0
|
1571 |
#ifdef _DEBUG
|
sl@0
|
1572 |
Panic(EPanicBadInvariant);
|
sl@0
|
1573 |
#endif
|
sl@0
|
1574 |
}
|
sl@0
|
1575 |
|