--- /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 <logger.h> // DEBUG
+#include <coemain.h>
+#include <eikenv.h>
+
+#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<java::util::FunctionServer*>(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<TInt>(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