taskswitcher/client/s60/src/tssession.cpp
author Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
Mon, 04 Oct 2010 00:38:31 +0300
changeset 124 e36b2f4799c0
parent 121 0b3699f6c654
permissions -rw-r--r--
Revision: 201037 Kit: 201039

/*
* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
* All rights reserved.
* This component and the accompanying materials are made available
* under the terms of "Eclipse Public License v1.0"
* which accompanies this distribution, and is available
* at the URL "http://www.eclipse.org/legal/epl-v10.html".
*
* Initial Contributors:
* Nokia Corporation - initial contribution.
*
* Contributors:
*
* Description:
*
*/
#include <s32mem.h>
#include <fbs.h>

#include "tssession.h"
#include "tsscreenshotmsg.h"
#include "tsunregscreenshotmsg.h"
#include "tsvisibilitymsg.h"

TInt RTsSession::Connect()
{
    TInt retry = 4;
    TInt error(KErrNone);
    do {
        error = CreateSession(KRunningAppServerName, TVersion(0, 0, 0));
        if (KErrNotFound == error || KErrServerTerminated == error) {
            error = StartServer();
            if (KErrNone == error || KErrAlreadyExists == error) {
                retry = 0;
                error = CreateSession(KRunningAppServerName, TVersion(0, 0, 0));
            }
        } else {
            retry = 0;
        }
    } while (--retry > 0);
    return error;
}

TInt RTsSession::StartServer()
    {
    RSemaphore semaphore;
    CleanupClosePushL(semaphore);
    TInt error = semaphore.OpenGlobal(KTsServerReadySemaphore);
    if (KErrNone != error) {
        RProcess server;
        CleanupClosePushL(server);
        error = server.Create(KRunningAppServerName, KNullDesC, TUidType(KNullUid, KNullUid, KRunningAppServerUid));
        if (KErrNone == error) 
            {
            TRequestStatus status;
            server.Rendezvous(status);
            if (status != KRequestPending) 
                {
                server.Kill(0);
                User::WaitForRequest(status);
                }
            else
                {
                server.Resume();
                User::WaitForRequest(status);
                }
            
            if(KErrCancel == status.Int())
                {
                error = KErrNone;
                }
            else
                {
                error = (EExitPanic == server.ExitType()) ? KErrGeneral : status.Int();
                }
            }
        CleanupStack::PopAndDestroy(&server);
        }
    CleanupStack::PopAndDestroy(&semaphore);
    return error;
    }


HBufC8* RTsSession::TasksContentLC()
{
    for (;;) {
        TPckgBuf<TInt> dataSize;
        User::LeaveIfError(SendReceive(GetRunningAppInfo, TIpcArgs(&dataSize)));        
        HBufC8* data = HBufC8::NewLC(dataSize());
        TPtr8 dataPointer(data->Des());
        TInt err = SendReceive(FlushData, TIpcArgs(&dataPointer, dataSize()));
        if (err == KErrNone) {
            return data;
        } else if (err != KErrCorrupt) {
            User::Leave(err);
        }
        CleanupStack::PopAndDestroy(data);
        // If result was KErrCorrupt then the size received from GetRunningAppInfo is
        // not valid anymore so restart the whole procedure.
    }
}

void RTsSession::Subscribe(TRequestStatus& aStatus)
{
    SendReceive(SubscribeRunningAppChanges, aStatus);
}

void RTsSession::CancelSubscribe()
{
    SendReceive(CancelSubscribeRunningAppChanges);
}

void RTsSession::OpenTask(const TDesC8 &key)
{
    SendReceive(OpenTaskMessage, TIpcArgs(&key));
}

void RTsSession::CloseTask(const TDesC8 &key)
{
    SendReceive(CloseTaskMessage, TIpcArgs(&key));
}

TInt RTsSession::RegisterScreenshot(CFbsBitmap *screenshot, TInt wgId, UpdatePriority priority)
{
   TRAPD(errNo, RegisterScreenshotL(screenshot, wgId, priority));
   return errNo;
}

TInt RTsSession::UnregisterScreenshot(TInt wgId)
{
    TRAPD(errNo, UnregisterScreenshotL(wgId));
   return errNo;
}

TInt RTsSession::SetVisibility(TInt wgId, Visibility value)
{
    TRAPD(errNo, SetVisibilityL(wgId, value));
    return errNo;
}

void RTsSession::RegisterScreenshotL(CFbsBitmap *screenshot, TInt wgId, UpdatePriority priority)
{
    CTsScreenshotMsg *message = CTsScreenshotMsg::NewLC(wgId, *screenshot, priority, 0);
    HBufC8* serializedData = message->ExternalizeLC();
    TIpcArgs arguments(serializedData);
    User::LeaveIfError(SendReceive(RegisterScreenshotMessage, arguments));
    CleanupStack::PopAndDestroy(serializedData);
    CleanupStack::PopAndDestroy(message);
}

void RTsSession::UnregisterScreenshotL(TInt wgId)
{
    CTsUnregisterScreenshotMsg *message = CTsUnregisterScreenshotMsg::NewLC(wgId);
    HBufC8* serializedData = message->ExternalizeLC();
    TIpcArgs arguments(serializedData);
    User::LeaveIfError(SendReceive(UnregisterScreenshotMessage, arguments));
    CleanupStack::PopAndDestroy(serializedData);
    CleanupStack::PopAndDestroy(message);
}

void RTsSession::SetVisibilityL(TInt wgId, Visibility value)
{
    CTsVisibilitMsg *message = CTsVisibilitMsg::NewLC(wgId, value);
    HBufC8* serializedData = message->ExternalizeLC();
    TIpcArgs arguments(serializedData);
    User::LeaveIfError(SendReceive(VisibilityChange, arguments));
    CleanupStack::PopAndDestroy(serializedData);
    CleanupStack::PopAndDestroy(message);
}