diff -r 3ab5c078b490 -r c63ee96dbe5f taskswitcher/client/s60/src/tssession.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/taskswitcher/client/s60/src/tssession.cpp Thu Sep 16 12:11:40 2010 +0100 @@ -0,0 +1,168 @@ +/* +* 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 +#include + +#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() +{ + TInt error; + + RSemaphore semaphore; + error = semaphore.CreateGlobal(KTsServerReadySemaphore, 0); + + if (KErrNone == error || KErrAlreadyExists == error) { + RProcess 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); + + // wait for server + semaphore.Wait(); + } + + if (KErrCancel == status.Int()) { + error = KErrNone; + } else { + error = (EExitPanic == server.ExitType()) ? KErrGeneral : status.Int(); + } + } + server.Close(); + } + semaphore.Close(); + + return error; +} + + +HBufC8* RTsSession::TasksContentLC() +{ + for (;;) { + TPckgBuf 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); + 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); +}