javauis/mmapi_qt/baseline/src/cmmaplayer.cpp
branchRCL_3
changeset 65 ae942d28ec0e
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/javauis/mmapi_qt/baseline/src/cmmaplayer.cpp	Tue Aug 31 15:09:22 2010 +0300
@@ -0,0 +1,496 @@
+/*
+* Copyright (c) 2002-2007 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 is base class for all players.
+*
+*/
+
+//  INCLUDE FILES
+#include <logger.h>
+
+#include <JniEnvWrapper.h>
+
+#include "cmmaplayer.h"
+#include "mmafunctionserver.h"
+#include "cmmadurationupdater.h"
+#include "cmmavolumecontrol.h"
+
+// CONSTANTS
+_LIT(KPanicOutOfMem, "out of memory");
+
+#ifdef _DEBUG // Needed only in ASSER_DEBUG statements.
+_LIT(KPanicMethod, "method not found");
+#endif
+
+CMMAPlayer::~CMMAPlayer()
+{
+    LOG(EJavaMMAPI, EInfo, "CMMAPlayer::~CMMAPlayer()");
+
+    iSourceStreams.ResetAndDestroy();
+    if (iControls.Count() > 0)
+        iControls.ResetAndDestroy();
+    iStateListeners.Reset();
+    delete iActionCompletedEvent;
+    delete iOOMErrorEvent;
+    delete iDurationUpdater;
+    delete iContentType;
+}
+
+
+CMMAPlayer::CMMAPlayer():
+        iRepeatNumberOfTimes(0),
+        iRepeatForever(EFalse),
+        iRepeatCount(0),
+        iDuration(KTimeUnknown),
+        iState(EUnrealized)
+{
+}
+
+
+void CMMAPlayer::ConstructL()
+{
+    LOG(EJavaMMAPI, EInfo, "MMA::CMMAPlayer::ConstructL + ");
+    iDurationUpdater = CMMADurationUpdater::NewL(*this);
+    LOG(EJavaMMAPI, EInfo, "MMA::CMMAPlayer::ConstructL - ");
+}
+
+
+void CMMAPlayer::StaticAddSourceStreamL(JNIEnv* aJniEnv,
+                                        CMMAPlayer* aPlayer,
+                                        MMAFunctionServer* aEventSource,
+                                        jobject aReader,
+                                        CMMASourceStream** aSourceStream)
+{
+    LOG(EJavaMMAPI, EInfo, "MMA::CMMAPlayer::StaticAddSourceStreamL +");
+
+    // JNI interface pointer can't be passed to different thread, so
+    // it is needed to get valid JNI interface pointer for Event Server thread
+    aJniEnv = aEventSource-> getValidJniEnv();
+
+    *aSourceStream = aPlayer->AddSourceStreamL(aJniEnv,
+                     aEventSource,
+                     aReader);
+    LOG(EJavaMMAPI, EInfo, "MMA::CMMAPlayer::StaticAddSourceStreamL -");
+}
+
+
+
+void CMMAPlayer::StaticSetPlayerListenerObjectL(CMMAPlayer* aPlayer,
+        MMAFunctionServer* aEventsource,
+        jobject aListenerObject,
+        JNIEnv* aJni,
+        MMMAEventPoster* aPoster)
+{
+
+    LOG(EJavaMMAPI, EInfo, "MMA::CMMAPlayer::StaticSetPlayerListenerObjectL +");
+
+    // JNI interface pointer can't be passed to different thread, so
+    // it is needed to get valid JNI interface pointer for Event Server thread
+    aJni = aEventsource-> getValidJniEnv();
+
+    aPlayer->SetPlayerListenerObjectL(aListenerObject, aJni, aPoster);
+
+    LOG(EJavaMMAPI, EInfo, "MMA::CMMAPlayer::StaticSetPlayerListenerObjectL -");
+}
+
+
+void CMMAPlayer::StaticInitPlayerL(CMMAPlayer* aPlayer,
+                                   MMAFunctionServer* aEventsource,
+                                   jobject aPlayerObject,
+                                   JNIEnv* aJni)
+{
+    LOG(EJavaMMAPI, EInfo, "MMA::CMMAPlayer::StaticInitPlayerL +");
+
+    // JNI interface pointer can't be passed to different thread, so
+    // it is needed to get valid JNI interface pointer for Event Server thread
+    aJni = aEventsource-> getValidJniEnv();
+
+    jmethodID actionCompletedMethod = aJni->GetMethodID(
+                                          aJni->GetObjectClass(aPlayerObject),
+                                          "actionCompleted",
+                                          "(I)V");
+
+    jmethodID actionCompletedFileMethod = aJni->GetMethodID(
+                                              aJni->GetObjectClass(aPlayerObject),
+                                              "actionCompletedFile",
+                                              "()V");
+
+    jmethodID actionCompletedStartMethod = aJni->GetMethodID(
+                                               aJni->GetObjectClass(aPlayerObject),
+                                               "actionCompletedStart",
+                                               "()V");
+
+    // Sanity Check, something is really wrong if methods cannot be found
+    __ASSERT_DEBUG(actionCompletedMethod,
+                   User::Panic(KPanicMethod, KErrGeneral));
+
+    aPlayer->iActionCompletedEvent = new(ELeave) CMMAEvent(
+        aPlayerObject,
+        actionCompletedMethod,
+        CMMAEvent::EReusableEvent);
+
+    aPlayer->iActionCompletedFileEvent = new(ELeave) CMMAEvent(
+        aPlayerObject,
+        actionCompletedFileMethod,
+        CMMAEvent::EReusableEvent);
+
+    aPlayer->iActionCompletedStartEvent = new(ELeave) CMMAEvent(
+        aPlayerObject,
+        actionCompletedStartMethod,
+        CMMAEvent::EReusableEvent);
+
+    LOG(EJavaMMAPI, EInfo, "MMA::CMMAPlayer::StaticInitPlayerL -");
+}
+
+CMMAControl* CMMAPlayer::StaticControl(CMMAPlayer* aPlayer, TInt aIndex)
+{
+    LOG(EJavaMMAPI, EInfo, "MMA::CMMAPlayer::StaticControl +");
+    return aPlayer->Control(aIndex);
+
+}
+
+
+void CMMAPlayer::RealizeL()
+{
+    LOG(EJavaMMAPI, EInfo, "MMA::CMMAPlayer::RealizeL +");
+    ChangeState(ERealized);
+
+}
+
+
+void CMMAPlayer::CloseL()
+{
+    LOG(EJavaMMAPI, EInfo, "MMA::CMMAPlayer::CloseL ");
+    ChangeState(EClosed);
+    PostObjectEvent(CMMAPlayerEvent::EClosed, NULL);
+}
+
+
+void CMMAPlayer::GetDuration(TInt64* aDuration)
+{
+    LOG(EJavaMMAPI, EInfo, "MMA::CMMAPlayer::GetDuration ");
+    *aDuration = iDuration;
+}
+
+
+void CMMAPlayer::SetMediaTimeL(TInt64* aTime)
+{
+    LOG(EJavaMMAPI, EInfo, "MMA::CMMAPlayer::SetMediaTimeL ");
+    *aTime = KErrNotSupported;
+}
+
+void CMMAPlayer::GetMediaTime(TInt64* aMediaTime)
+{
+    LOG(EJavaMMAPI, EInfo, "MMA::CMMAPlayer::GetMediaTime ");
+    *aMediaTime = KErrNotSupported;
+}
+
+
+EXPORT_C void CMMAPlayer::SetLoopCount(TInt aCount)
+{
+    LOG(EJavaMMAPI, EInfo, "MMA::CMMAPlayer::SetLoopCount ");
+    iRepeatForever = (aCount == KJavaRepeatForever);
+    iRepeatNumberOfTimes = aCount;
+    iRepeatCount = 0;
+}
+
+HBufC* CMMAPlayer::ContentType() const
+{
+    LOG(EJavaMMAPI, EInfo, "MMA::CMMAPlayer::ContentType ");
+    return iContentType;
+}
+
+void CMMAPlayer::SetPlayerListenerObjectL(jobject aListenerObject,
+        JNIEnv* aJni,
+        MMMAEventPoster* aEventPoster)
+{
+    LOG(EJavaMMAPI, EInfo, "MMA::CMMAPlayer::SetPlayerListenerObjectL +");
+    iListenerObject = aListenerObject;
+    iEventPoster = aEventPoster;
+
+    jclass listenerClass = aJni->GetObjectClass(aListenerObject);
+
+    iPostEvent = aJni->GetMethodID(
+                     listenerClass,
+                     "postEvent",
+                     "(Ljava/lang/String;Ljava/lang/Object;)V");
+
+    iPostObjectEvent = aJni->GetMethodID(listenerClass,
+                                         "postObjectEvent",
+                                         "(ILjava/lang/Object;)V");
+
+    iPostLongEvent = aJni->GetMethodID(listenerClass,
+                                       "postLongEvent",
+                                       "(IJ)V");
+
+    iPostStringEvent = aJni->GetMethodID(listenerClass,
+                                         "postStringEvent",
+                                         "(ILjava/lang/String;)V");
+
+    iPostControlEvent = aJni->GetMethodID(listenerClass,
+                                          "postControlEvent",
+                                          "(ILjava/lang/String;)V");
+
+
+    // Sanity Check, something is really wrong if methods cannot be found
+    __ASSERT_DEBUG(iPostEvent &&
+                   iPostObjectEvent &&
+                   iPostLongEvent &&
+                   iPostStringEvent &&
+                   iPostControlEvent,
+                   User::Panic(KPanicMethod, KErrGeneral));
+
+    iOOMErrorEvent = new(ELeave) CMMAPlayerEvent(iListenerObject,
+            iPostStringEvent,
+            CMMAEvent::EReusableEvent);
+    iOOMErrorEvent->SetStringEventL(CMMAPlayerEvent::EError,
+                                    KPanicOutOfMem);
+
+    LOG(EJavaMMAPI, EInfo, "MMA::CMMAPlayer::SetPlayerListenerObjectL -");
+}
+
+
+EXPORT_C TInt CMMAPlayer::ControlCount()
+{
+    return iControls.Count();
+}
+
+
+EXPORT_C CMMAControl* CMMAPlayer::Control(TInt aIndex)
+{
+    return iControls[ aIndex ];
+}
+
+void CMMAPlayer::RefreshControls()
+{
+
+    for (TInt index = 0; index < iControls.Count(); index++)
+    {
+        CMMAControl* control = iControls[ index ];
+        control->RefreshControl();
+    }
+
+}
+
+EXPORT_C  void CMMAPlayer::AddStateListenerL(MMMAPlayerStateListener* aListener)
+{
+    LOG(EJavaMMAPI, EInfo, "MMA::CMMAPlayer::AddStateListenerL +");
+    TInt err = iStateListeners.Append(aListener);
+    LOG1(EJavaMMAPI, EInfo, "MMA::CMMAPlayer::AddStateListenerL - err = %d ",err);
+    User::LeaveIfError(err);
+    //User::LeaveIfError(iStateListeners.Append(aListener));
+
+}
+
+EXPORT_C void CMMAPlayer::RemoveStateListener(MMMAPlayerStateListener* aListener)
+{
+
+    TInt index = iStateListeners.Find(aListener);
+
+    if (index != KErrNotFound)
+    {
+        iStateListeners.Remove(index);
+    }
+
+}
+
+const TDesC& CMMAPlayer::Type()
+{
+    // by default player has not the type
+    return KNullDesC;
+}
+
+void CMMAPlayer::SetContentType(HBufC* aContentType)
+{
+
+    delete iContentType;
+    iContentType = aContentType;
+
+}
+
+void CMMAPlayer::ResetSourceStreams()
+{
+    LOG(EJavaMMAPI, EInfo, "MMA::CMMAPlayer::ResetSourceStreams +");
+    int sourceStreamsCount = iSourceStreams.Count();
+    for (int i = 0; i < sourceStreamsCount; i++)
+    {
+        iSourceStreams[ i ]->ResetData();
+    }
+    LOG(EJavaMMAPI, EInfo, "MMA::CMMAPlayer::ResetSourceStreams -");
+}
+
+EXPORT_C void CMMAPlayer::AddControlL(CMMAControl* aControl)
+{
+
+    User::LeaveIfError(iControls.Append(aControl));
+
+}
+
+void CMMAPlayer::PostLongEvent(CMMAPlayerEvent::TEventType aEventType,
+                               const TInt64& aLongEventData)
+{
+    LOG(EJavaMMAPI, EInfo, "MMA::CMMAPlayer::PostLongEvent ");
+    if (!iListenerObject || !iEventPoster)
+    {
+        LOG(EJavaMMAPI, EInfo, "MMA::CMMAPlayer::PostLongEvent No listener");
+        // return since player is not ready for posting any events and is not initialized
+        return;
+    }
+
+    CMMAPlayerEvent* playerEvent = new CMMAPlayerEvent(iListenerObject,
+            iPostLongEvent);
+    if (!playerEvent)
+    {
+        // creation of player event failed, informing Java
+        iEventPoster->PostEvent(iOOMErrorEvent);
+        return;
+    }
+    playerEvent->SetLongEvent(aEventType, aLongEventData);
+
+    // event poster takes ownership of event
+    iEventPoster->PostEvent(playerEvent);
+}
+
+
+EXPORT_C void CMMAPlayer::PostStringEvent(CMMAPlayerEvent::TEventType aEventType,
+        const TDesC& aStringEventData)
+{
+    LOG(EJavaMMAPI, EInfo, "MMA::CMMAPlayer::PostStringEvent ");
+    if (!iListenerObject || !iEventPoster)
+    {
+        LOG(EJavaMMAPI, EInfo, "MMA::CMMAPlayer::PostStringEvent No listener");
+        // return since player is not ready for posting any events and is not initialized
+        return;
+    }
+
+    CMMAPlayerEvent* playerEvent = new CMMAPlayerEvent(iListenerObject,
+            iPostStringEvent);
+    if (!playerEvent)
+    {
+        // creation of player event failed, informing Java
+        iEventPoster->PostEvent(iOOMErrorEvent);
+        return;
+    }
+
+    TRAPD(err, playerEvent->SetStringEventL(aEventType, aStringEventData));
+    if (err != KErrNone)
+    {
+        // string setting failed, informing Java
+        iEventPoster->PostEvent(iOOMErrorEvent);
+        return;
+    }
+
+    // event poster takes ownership of event
+    iEventPoster->PostEvent(playerEvent);
+}
+
+
+EXPORT_C void CMMAPlayer::PostObjectEvent(CMMAPlayerEvent::TEventType aEventType,
+        const jobject aEventData)
+{
+    LOG(EJavaMMAPI, EInfo, "MMA::CMMAPlayer::PostObjectEvent ");
+
+    if (!iListenerObject || !iEventPoster)
+    {
+        LOG(EJavaMMAPI, EInfo, "MMA::CMMAPlayer::PostObjectEvent No listener");
+        // return since player is not ready for posting any events and is not initialized
+        return;
+    }
+
+    CMMAPlayerEvent* playerEvent = new CMMAPlayerEvent(iListenerObject,
+            iPostObjectEvent);
+
+    if (!playerEvent)
+    {
+        // creation of player event failed, informing Java
+        iEventPoster->PostEvent(iOOMErrorEvent);
+        return;
+    }
+
+    TRAPD(err, playerEvent->SetObjectEventL(aEventType, aEventData));
+    if (err != KErrNone)
+    {
+        // creation of player event failed, informing Java
+        iEventPoster->PostEvent(iOOMErrorEvent);
+        return;
+    }
+
+    // event poster takes ownership of event
+    iEventPoster->PostEvent(playerEvent);
+}
+
+EXPORT_C CMMASourceStream* CMMAPlayer::AddSourceStreamL(JNIEnv* aJNIEnv,
+        MMAFunctionServer* aEventSource,
+        jobject aReader)
+{
+    LOG(EJavaMMAPI, EInfo, "MMA::CMMAPlayer::AddSourceStreamL ");
+    CMMASourceStream* sourceStream = CMMASourceStream::NewL(aJNIEnv,
+                                     aEventSource,
+                                     aReader,
+                                     this);
+
+    CleanupStack::PushL(sourceStream);
+    User::LeaveIfError(iSourceStreams.Append(sourceStream));
+    CleanupStack::Pop(); // sourceStream
+    return sourceStream;
+}
+
+
+EXPORT_C void CMMAPlayer::PostActionCompleted(TInt aError)
+{
+    LOG(EJavaMMAPI, EInfo, "MMA::CMMAPlayer::PostActionCompleted ");
+    iActionCompletedEvent->SetEventData(aError);
+    iEventPoster->PostEvent(iActionCompletedEvent,
+                            CMMAEvent::ENotifyPriority);
+}
+
+void CMMAPlayer::PostActionCompletedFile()
+{
+    LOG(EJavaMMAPI, EInfo, "MMA::CMMAPlayer::PostActionCompletedFile ");
+    // iActionCompletedFileEvent->SetEventData(aError);
+    iEventPoster->PostEvent(iActionCompletedFileEvent,
+                            CMMAEvent::ENotifyPriority);
+}
+
+
+void CMMAPlayer::PostActionCompletedStart()
+{
+    LOG(EJavaMMAPI, EInfo, "MMA::CMMAPlayer::PostActionCompletedStart ");
+    iEventPoster->PostEvent(iActionCompletedStartEvent,
+                            CMMAEvent::ENotifyPriority);
+}
+
+void CMMAPlayer::ChangeState(TPlayerState aState)
+{
+    iState = aState;
+    LOG1(EJavaMMAPI, EInfo, "MMA::CMMAPlayer::ChangeState - iStateListeners count is %d", iStateListeners.Count());
+    for (TInt i(0); i<iStateListeners.Count(); i++)
+    {
+        iStateListeners[ i ]->StateChanged(aState);
+    }
+    LOG1(EJavaMMAPI, EInfo, "MMA::CMMAPlayer::ChangeState - State changed to %d", iState);
+}
+
+void CMMAPlayer::ReadCompletedL(TInt /*aStatus*/, const TDesC8& /*aData*/)
+{
+    // empty implementation
+    LOG(EJavaMMAPI, EInfo, "MMA::CMMAPlayer::ReadCompletedL ");
+}
+void CMMAPlayer:: DeleteControls()
+{
+    if (iControls.Count() > 0)
+    {
+        iControls.ResetAndDestroy();
+    }
+}
+//  END OF FILE