diff -r 6c158198356e -r ae942d28ec0e javauis/mmapi_qt/baseline/src/mmafunctionserver.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/javauis/mmapi_qt/baseline/src/mmafunctionserver.cpp Tue Aug 31 15:09:22 2010 +0300 @@ -0,0 +1,245 @@ +/* +* Copyright (c) 2002 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: This class provides CJavaEventSource services +* +*/ + + +// INCLUDE FILES +#include // DEBUG +#include +#include + +#include "mmafunctionserver.h" +#include "cmmaevent.h" +#include "cmmaplayer.h" +#include "mmmaplayerinstanceobserver.h" +#ifdef RD_JAVA_VOLUME_CONTROL +#include "cmmaglobalvolume.h" +#endif // RD_JAVA_VOLUME_CONTROL + +MMAFunctionServer::MMAFunctionServer(JNIEnv& aJni, jobject aPeer): java::util::FunctionServer("JavaMMAPIFunctionServer") +{ + LOG(EJavaMMAPI, EInfo, "++MMAFunctionServer::MMAFunctionServer"); + createServerToNewThread(); + attachToVm(aJni, aPeer); + mVmAttached = true; + iServer = reinterpret_cast(this); +} + +MMAFunctionServer::~MMAFunctionServer() +{ + LOG(EJavaMMAPI, EInfo, "MMA::MMAFunctionServer::~MMAFunctionServer()"); + if (mVmAttached) + { + detachFromVm(); + } + stopServer(); +#ifdef RD_JAVA_VOLUME_CONTROL + delete iGlobalVolume; +#endif // RD_JAVA_VOLUME_CONTROL +} + +TInt MMAFunctionServer::NewL(JNIEnv& aJni, jobject aPeer) +{ + + MMAFunctionServer* self = new(ELeave) MMAFunctionServer(aJni,aPeer); + self->ConstructL(aJni,aPeer); + return reinterpret_cast(self); +} +void MMAFunctionServer::ConstructL(JNIEnv& aJni, + jobject /*aPeer*/ + ) +{ + LOG(EJavaMMAPI, EInfo, "MMA::MMAFunctionServer::ConstructL +"); + aJni.GetJavaVM(&iJavaVM); // Get pointer to VM + LOG(EJavaMMAPI, EInfo, "MMA::MMAFunctionServer::ConstructL -"); +} + +java::util::FunctionServer* MMAFunctionServer::getFunctionServer() const +{ + LOG(EJavaMMAPI, EInfo, "++getFunctionServer1"); + JELOG2(EJavaMMAPI); + return iServer; +} +JNIEnv* MMAFunctionServer::getValidJniEnv() +{ + JELOG2(EJavaLocation); + return mJniEnv; +} +jobject MMAFunctionServer::getPeer() +{ + return mJavaPeerObject; +} + +void MMAFunctionServer::ConstructSvrL() +{ + // creating fbs session + User::LeaveIfError(RFbsSession::Connect()); + iFbsSessionConnected = ETrue; + LOG(EJavaMMAPI, EInfo, "MMA::MMAFunctionServer::ConstructSvrL ok"); +} + +EXPORT_C void MMAFunctionServer::StaticAddObjectFromHandleL( + MMAFunctionServer* aEventSource, + TInt aHandle) +{ + aEventSource->AddObjectFromHandleL(aHandle); +} + +void MMAFunctionServer::AddPlayerL(CMMAPlayer* aPlayer) +{ + if (iInstanceObserver) + { + iInstanceObserver->AddPlayerNotifyL(aPlayer); + } +#ifdef RD_JAVA_VOLUME_CONTROL + if (iGlobalVolume) + { + iGlobalVolume->AddPlayerL(aPlayer); + } +#endif // RD_JAVA_VOLUME_CONTROL + TInt err = iPlayers.Append(aPlayer); + + if (err != KErrNone) + { + // There was no memory to add new player to array, + // player must be removed from instance observer. + if (iInstanceObserver) + { + iInstanceObserver->RemovePlayerNotify(aPlayer); + } +#ifdef RD_JAVA_VOLUME_CONTROL + if (iGlobalVolume) + { + iGlobalVolume->RemovePlayer(aPlayer); + } +#endif // RD_JAVA_VOLUME_CONTROL + User::Leave(err); + } +} + +void MMAFunctionServer::DisposePlayer(CMMAPlayer* aPlayer) +{ + TInt index = iPlayers.Find(aPlayer); + if (index != KErrNotFound) + { + if (iInstanceObserver) + { + iInstanceObserver->RemovePlayerNotify(aPlayer); + } +#ifdef RD_JAVA_VOLUME_CONTROL + if (iGlobalVolume) + { + iGlobalVolume->RemovePlayer(aPlayer); + } +#endif // RD_JAVA_VOLUME_CONTROL + delete iPlayers[ index ]; + + // remove object from list + iPlayers.Remove(index); + } +} + +EXPORT_C void MMAFunctionServer::SetPlayerInstanceObserver( + MMMAPlayerInstanceObserver* aObserver) +{ + iInstanceObserver = aObserver; +} + +EXPORT_C RPointerArray< CMMAPlayer >& MMAFunctionServer::Players() +{ + return iPlayers; +} + +void MMAFunctionServer::Release() +{ + // If player instance observer is added to event source, remove all + // players from observer before deleting those. + if (iInstanceObserver) + { + for (TInt i = 0; i < iPlayers.Count(); i++) + { + iInstanceObserver->RemovePlayerNotify(iPlayers[ i ]); +#ifdef RD_JAVA_VOLUME_CONTROL + if (iGlobalVolume) + { + iGlobalVolume->RemovePlayer(iPlayers[ i ]); + } +#endif // RD_JAVA_VOLUME_CONTROL + } + } + + iPlayers.ResetAndDestroy(); +} + +void MMAFunctionServer::AddObjectFromHandleL(TInt aHandle) +{ + User::LeaveIfError(iObjects.Append(reinterpret_cast< CBase* >(aHandle))); +} + + +void MMAFunctionServer::FinalizeSvr() +{ + LOG1(EJavaMMAPI, EInfo, "MMA::MMAFunctionServer::FinalizeSvr() object count = %d", + iObjects.Count()); + LOG1(EJavaMMAPI, EInfo, "MMA::MMAFunctionServer::FinalizeSvr() player count = %d", + iPlayers.Count()); + + // After object array alements are deleted all external references to + // player objects are removed and player array can be deleted. + iObjects.ResetAndDestroy(); + iPlayers.ResetAndDestroy(); + + if (iFbsSessionConnected) + { + RFbsSession::Disconnect(); + iFbsSessionConnected = EFalse; + } + LOG(EJavaMMAPI, EInfo, "MMA::MMAFunctionServer::FinalizeSvr() ok"); +} + + +void MMAFunctionServer::PostEvent(CMMAEvent* aEvent, TInt /*aPriority*/) +{ + LOG(EJavaMMAPI, EInfo, "MMAFunctionServer::PostEvent"); + aEvent->Dispatch(*mJniEnv); +} + +CMMAPlayer* MMAFunctionServer::FindPlayer(TInt aPlayerHandle) +{ + LOG(EJavaMMAPI, EInfo, "MMAFunctionServer::FindPlayer"); + CMMAPlayer* player = reinterpret_cast< CMMAPlayer* >(aPlayerHandle); + TInt index = iPlayers.Find(player); + if (index != KErrNotFound) + { + player = iPlayers[ index ]; + LOG(EJavaMMAPI, EInfo, "MMAFunctionServer::FindPlayer: player found"); + } + else + { + LOG(EJavaMMAPI, EInfo, "MMAFunctionServer::FindPlayer: player not found"); + player = NULL; + } + return player; +} +#ifdef RD_JAVA_VOLUME_CONTROL +void MMAFunctionServer::SetGlobalVolume(CMMAGlobalVolume* aGlobalVolume) +{ + delete iGlobalVolume; + iGlobalVolume = aGlobalVolume; +} +#endif // RD_JAVA_VOLUME_CONTROL + +// END OF FILE