diff -r f5050f1da672 -r 04becd199f91 javacommons/utils/functionserver/src.s60/os_functionserver.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/javacommons/utils/functionserver/src.s60/os_functionserver.cpp Tue Apr 27 16:30:29 2010 +0300 @@ -0,0 +1,162 @@ +/* +* Copyright (c) 2008 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: ?Description +* +*/ + + +#include +#include "fs_functor.h" +#include "os_functionserver.h" +#include "javasymbianoslayer.h" +#include "logger.h" +#include "exceptionbase.h" + +using namespace java::util; + + +// ======== MEMBER FUNCTIONS ======== + + +inline OsFunctionServer::CFunctionSession::CFunctionSession() +{ + JELOG2(EUtils); +} + +TInt OsFunctionServer::CFunctionSession::doServiceL(TAction action, const TAny* param) +{ + JELOG2(EUtils); + switch (action) + { + case EExecute: + (*static_cast(param))(); // It doesn't look like it but this may leave + return KErrNone; + case EStop: + ((OsFunctionServer*)Server())->startShutDown(); + return KErrNone; + default: + return KErrNotSupported; + } +} + +void OsFunctionServer::CFunctionSession::ServiceL(const RMessage2& message) +{ + JELOG2(EUtils); + TRAPD(error, (doServiceL(static_cast(message.Function()), message.Ptr0()))); + if (error) + { + if (error == KLeaveExit) // This is used to exit the application, we obviously want to let it through + { + User::Leave(KLeaveExit); + } + } + message.Complete(error); +} + +OsFunctionServer::OsFunctionServer() + : CServer2(EPriorityStandard, ESharableSessions) +{ + JELOG2(EUtils); +} + +OsFunctionServer::~OsFunctionServer() +{ + JELOG2(EUtils); +} +void OsFunctionServer::startShutDown() +{ + JELOG2(EUtils); + mShutdown.startShutDown(); +} + +void OsFunctionServer::startOsServer() +{ + JELOG2(EUtils); + TRAPD(err, StartL(KNullDesC)); + if (err != 0) + { + std::string errorStr("FServer creation failed: "); + errorStr.append(JavaCommonUtils::intToString(err)); + throw java::util::ExceptionBase(errorStr, __FILE__, __FUNCTION__, __LINE__); + } +} + + +// +// Virtual methods from CServer2 +// + +OS_EXPORT TInt OsFunctionServer::RunError(TInt error) +{ + JELOG2(EUtils); + if (error == KLeaveExit) // This is used to exit the application, we obviously want to let it through + { + return error; + } + else + { + return CServer2::RunError(error); + } +} + +OS_EXPORT CSession2* OsFunctionServer::NewSessionL(const TVersion& /*version*/, const RMessage2& /*message*/) const +{ + JELOG2(EUtils); + return new(ELeave) CFunctionSession(); +} + + +void OsFunctionServer::stopServerInsideServerThread() +{ + JELOG2(EUtils); + CActiveScheduler::Stop(); +} + +ServerShutdown::ServerShutdown() + : CActive(CActive::EPriorityStandard) +{ +} + +void ServerShutdown::startShutDown() +{ + CActiveScheduler::Add(this); + iStatus=KRequestPending; + TRequestStatus* status = &iStatus; + User::RequestComplete(status, KErrNone); + SetActive(); +} + + +void ServerShutdown::RunL() +{ + JELOG2(EUtils); + CActiveScheduler::Stop(); +} + +TInt ServerShutdown::RunError(TInt error) +{ + JELOG2(EUtils); + if (error == KLeaveExit) + { + return error; + } + return KErrNone; +} + +void ServerShutdown::DoCancel() +{ + JELOG2(EUtils); + // nop +} +