tstaskmonitor/client/s60/src/tstaskmonitorsession.cpp
changeset 94 dbb8300717f7
equal deleted inserted replaced
93:82b66994846c 94:dbb8300717f7
       
     1 /*
       
     2 * Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
       
     3 * All rights reserved.
       
     4 * This component and the accompanying materials are made available
       
     5 * under the terms of "Eclipse Public License v1.0"
       
     6 * which accompanies this distribution, and is available
       
     7 * at the URL "http://www.eclipse.org/legal/epl-v10.html".
       
     8 *
       
     9 * Initial Contributors:
       
    10 * Nokia Corporation - initial contribution.
       
    11 *
       
    12 * Contributors:
       
    13 *
       
    14 * Description: 
       
    15 *
       
    16 */
       
    17 #include <s32mem.h>
       
    18 
       
    19 #include "tstaskmonitorsession.h"
       
    20 #include "tstaskmonitorglobals.h"
       
    21 
       
    22 void RTsTaskMonitorSession::TaskListL(RTsFswArray& tasks)
       
    23 {
       
    24     for (;;) {
       
    25         TPckgBuf<TInt> dataSize;
       
    26         User::LeaveIfError(SendReceive(GetRunningAppInfo, TIpcArgs(&dataSize)));
       
    27         HBufC8* data = HBufC8::NewLC(dataSize());
       
    28         TPtr8 dataPointer(data->Des());
       
    29         TInt err = SendReceive(FlushData, TIpcArgs(&dataPointer, dataSize()));
       
    30         if (err == KErrNone) {
       
    31             RDesReadStream dataStream(dataPointer);
       
    32             CleanupClosePushL(dataStream);
       
    33             CTsFswEntry::InternalizeArrayL(dataStream, tasks);
       
    34             CleanupStack::PopAndDestroy(&dataStream);
       
    35         } else if (err != KErrCorrupt) {
       
    36             User::Leave(err);
       
    37         }
       
    38         CleanupStack::PopAndDestroy(data);
       
    39         if (err == KErrNone) {
       
    40             break;
       
    41         }
       
    42         // If result was KErrCorrupt then the size received from GetRunningAppInfo is
       
    43         // not valid anymore so restart the whole procedure.
       
    44     }
       
    45 }
       
    46 
       
    47 TInt RTsTaskMonitorSession::StartServer()
       
    48 {
       
    49     RProcess server;
       
    50     if (TInt error = server.Create(KRunningAppServerName, KNullDesC, TUidType(KNullUid, KNullUid, KRunningAppServerUid))) {
       
    51         return error;
       
    52     }
       
    53 
       
    54     TRequestStatus status;
       
    55     server.Rendezvous(status);
       
    56     if (status != KRequestPending) {
       
    57         server.Kill(0);
       
    58     } else {
       
    59         server.Resume();
       
    60     }
       
    61 
       
    62     User::WaitForRequest(status);
       
    63     TInt error = (EExitPanic == server.ExitType()) ? KErrGeneral : status.Int();
       
    64     if (KErrCancel == error) {
       
    65         error = KErrNone;
       
    66     }
       
    67     server.Close();
       
    68 
       
    69     return error;
       
    70 }
       
    71 
       
    72 TInt RTsTaskMonitorSession::Connect()
       
    73 {
       
    74     TInt retry = 4;
       
    75     TInt error(KErrNone);
       
    76     do {
       
    77         error = CreateSession(KRunningAppServerName, TVersion(0, 0, 0));
       
    78         if (KErrNotFound != error && KErrServerTerminated != error) {
       
    79             retry = 0;
       
    80         } else {
       
    81             error = StartServer();
       
    82             if (KErrNone != error && KErrAlreadyExists != error) {
       
    83                 retry = 0;
       
    84                 error = CreateSession(KRunningAppServerName, TVersion(0, 0, 0));
       
    85             }
       
    86         }
       
    87     } while (--retry > 0);
       
    88     return error;
       
    89 }
       
    90 
       
    91 void RTsTaskMonitorSession::Subscribe(TRequestStatus& aStatus)
       
    92 {
       
    93     SendReceive(SubscribeRunningAppChanges, aStatus);
       
    94 }
       
    95 
       
    96 void RTsTaskMonitorSession::CancelSubscribe()
       
    97 {
       
    98     SendReceive(CancelSubscribeRunningAppChanges);
       
    99 }