--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/javauis/amms_akn/module/src/cammscontrolgroup.cpp Tue Apr 27 16:30:29 2010 +0300
@@ -0,0 +1,286 @@
+/*
+* Copyright (c) 2005 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: Base class for control groups
+*
+*/
+
+
+// INCLUDE FILES
+#include <jdebug.h>
+#include "cammscontrolgroup.h"
+#include <cmmaplayer.h>
+#include "cammscontrol.h"
+#include "ammsutil.h"
+#include "cammsplayerstatelistener.h"
+
+#ifdef _DEBUG
+_LIT(KAMMSNoGroupNameError, "No group name");
+#endif
+
+// ============================ MEMBER FUNCTIONS ===============================
+
+// -----------------------------------------------------------------------------
+// CAMMSControlGroup::~CAMMSControlGroup
+// Destructor.
+// (other items were commented in a header).
+// -----------------------------------------------------------------------------
+CAMMSControlGroup::~CAMMSControlGroup()
+{
+ if (iPlayerStateListeners)
+ {
+ iPlayerStateListeners->ResetAndDestroy();
+ delete iPlayerStateListeners;
+ }
+
+ iControls.Close();
+}
+
+// -----------------------------------------------------------------------------
+// CAMMSControlGroup::PlayerStateChangedL
+// This function is called when state of a player has changed.
+// (other items were commented in a header).
+// -----------------------------------------------------------------------------
+void CAMMSControlGroup::PlayerStateChangedL(
+ CMMAPlayer* aPlayer,
+ TInt aNewState)
+{
+ CMMAControl* findControl = AMMSUtil::FindControl(
+ aPlayer, iName, iControlType);
+
+ // It is safe to cast CMMAControl to the subclass CAMMSControl, as only
+ // AMMS Controls are returned from FindControl method
+ CAMMSControl* control = static_cast< CAMMSControl* >(findControl);
+
+ // The player has a control belonging to this group if this function
+ // is called.
+ __ASSERT_DEBUG(control, User::Invariant());
+
+ TInt controlIndex = iControls.Find(control);
+
+ // Add the control of the player to the group if the player is prefetched
+ // or started.
+ if (controlIndex == KErrNotFound)
+ {
+ if ((aNewState == CMMAPlayer::EPrefetched) ||
+ (aNewState == CMMAPlayer::EStarted))
+ {
+ // Now it is safe to call PrepareControlL to initialize the Control
+ DEBUG_INT("AMMS::CAMMSControlGroup::PlayerStateChangedL calling PrepareControl for type: %d",
+ control->iControlType);
+ control->PrepareControlL();
+
+ // Add control to controls array
+ User::LeaveIfError(iControls.Append(control));
+
+ // Notify derived classes about new player control
+ NotifyPlayerAddedL(aPlayer, control);
+ }
+ }
+
+ // Remove the control of the player from the group if the player is
+ // deallocated or closed.
+ else
+ {
+ if ((aNewState == CMMAPlayer::ERealized) ||
+ (aNewState == CMMAPlayer::EClosed))
+ {
+ // Call DeallocateControl to delete the Control's Effect API class
+ DEBUG_INT("AMMS::CAMMSControlGroup::PlayerStateChangedL calling DeallocateControl for type: %d",
+ control->iControlType);
+ control->DeallocateControl();
+
+ NotifyPlayerRemoved(aPlayer, control);
+ iControls.Remove(controlIndex);
+ }
+ }
+}
+
+// -----------------------------------------------------------------------------
+// CAMMSControlGroup::ConstructL
+// 2nd phase constructor.
+// (other items were commented in a header).
+// -----------------------------------------------------------------------------
+void CAMMSControlGroup::ConstructL()
+{
+ iPlayerStateListeners =
+ new(ELeave) CArrayPtrSeg< CAMMSPlayerStateListener >(1);
+}
+
+// -----------------------------------------------------------------------------
+// CAMMSControlGroup::ControlCount
+// Returns the total count of controls in this group.
+// (other items were commented in a header).
+// -----------------------------------------------------------------------------
+TInt CAMMSControlGroup::ControlCount() const
+{
+ return iControls.Count();
+}
+
+// -----------------------------------------------------------------------------
+// CAMMSControlGroup::Control
+// Gets control. Ownership is not tranferred.
+// (other items were commented in a header).
+// -----------------------------------------------------------------------------
+CMMAControl* CAMMSControlGroup::Control(TInt aIndex) const
+{
+ // aIndex must not be negative and must not be greater than the number
+ // of objects currently in the array,
+ // otherwise the operator raises a USER-130 panic.
+ return iControls[ aIndex ];
+}
+
+
+// -----------------------------------------------------------------------------
+// CAMMSControlGroup::NotifyPlayerRemoved
+// Called by PlayerAddedL when new player is added
+// (other items were commented in a header).
+// -----------------------------------------------------------------------------
+void CAMMSControlGroup::NotifyPlayerAddedL(
+ CMMAPlayer* /*aPlayer*/,
+ CMMAControl* /*aControl*/)
+{
+}
+
+// -----------------------------------------------------------------------------
+// CAMMSControlGroup::NotifyPlayerRemoved
+// Called by PlayerRemoved when a player is removed
+// (other items were commented in a header).
+// -----------------------------------------------------------------------------
+void CAMMSControlGroup::NotifyPlayerRemoved(
+ CMMAPlayer* /*aPlayer*/,
+ CMMAControl* /*aControl*/)
+{
+}
+
+// -----------------------------------------------------------------------------
+// CAMMSControlGroup::PlayerAddedL
+// Called by the owning module when a player is added
+// (other items were commented in a header).
+// -----------------------------------------------------------------------------
+void CAMMSControlGroup::PlayerAddedL(CMMAPlayer *aPlayer)
+{
+ // All derived classes must define name for the group
+ __ASSERT_DEBUG(iName != KNullDesC,
+ User::Panic(KAMMSNoGroupNameError,
+ KErrUnknown));
+
+ // Do nothing if the player does not have a control belonging to this group.
+ CMMAControl* findControl = AMMSUtil::FindControl(
+ aPlayer, iName, iControlType);
+ if (!findControl)
+ {
+ return;
+ }
+
+ // It is safe to cast CMMAControl to the subclass CAMMSControl, as only
+ // AMMS Controls are returned from FindControl method
+ CAMMSControl* control = static_cast< CAMMSControl* >(findControl);
+
+ CAMMSPlayerStateListener* playerListener =
+ CAMMSPlayerStateListener::NewLC(aPlayer, this);
+
+ iPlayerStateListeners->AppendL(playerListener);
+
+ CleanupStack::Pop(playerListener);
+
+ // Add the control of the player directly to the group
+ // if the player is in STARTED or PREFETCHED state.
+ // If not, the control is added later when the player changes
+ // its state to PREFETCHED.
+ TInt playerState = aPlayer->State();
+
+ if ((playerState == CMMAPlayer::EPrefetched) ||
+ (playerState == CMMAPlayer::EStarted))
+ {
+ // Now it is safe to call PrepareControlL to initialize the Control
+ DEBUG_INT("AMMS::CAMMSControlGroup::PlayerAddedL calling PrepareControl for type: %d",
+ control->iControlType);
+ control->PrepareControlL();
+
+ // Add control to controls array
+ User::LeaveIfError(iControls.Append(control));
+
+ // Notify derived classes about new player control
+ NotifyPlayerAddedL(aPlayer, control);
+ }
+}
+
+// -----------------------------------------------------------------------------
+// CAMMSControlGroup::PlayerRemoved
+// Called by the owning module when a player is removed
+// (other items were commented in a header).
+// -----------------------------------------------------------------------------
+void CAMMSControlGroup::PlayerRemoved(CMMAPlayer *aPlayer)
+{
+ CMMAControl* control = AMMSUtil::FindControl(
+ aPlayer, iName, iControlType);
+
+ // Do nothing if the player does not have a control belonging to this group.
+ if (!control)
+ {
+ return;
+ }
+
+ // Remove the control of the player if the control is in the group.
+ TInt controlIndex = iControls.Find(control);
+ if (controlIndex != KErrNotFound)
+ {
+ // It is safe to cast CMMAControl to the subclass CAMMSControl, as only
+ // AMMS Controls are returned from FindControl method
+ CAMMSControl* ammsControl = static_cast< CAMMSControl* >(control);
+
+ // Call DeallocateControl to delete the Control's Effect API class
+ DEBUG_INT("AMMS::CAMMSControlGroup::PlayerRemoved calling DeallocateControl for type: %d",
+ ammsControl->iControlType);
+ ammsControl->DeallocateControl();
+
+ NotifyPlayerRemoved(aPlayer, ammsControl);
+ iControls.Remove(controlIndex);
+ }
+
+ // Remove the state listener belonging to the given player.
+
+ TInt listenerCount = iPlayerStateListeners->Count();
+ TInt listenerIndex = KErrNotFound;
+
+ for (TInt i = 0; i < listenerCount; i++)
+ {
+ // Elements in the listener array are never null.
+ if (iPlayerStateListeners->At(i)->Player() == aPlayer)
+ {
+ listenerIndex = i;
+ break;
+ }
+ }
+
+ if (listenerIndex != KErrNotFound)
+ {
+ delete iPlayerStateListeners->At(listenerIndex);
+ iPlayerStateListeners->Delete(listenerIndex);
+ }
+}
+
+// -----------------------------------------------------------------------------
+// CAMMSControlGroup::CAMMSControlGroup
+// C++ default constructor can NOT contain any code, that might leave.
+// -----------------------------------------------------------------------------
+CAMMSControlGroup::CAMMSControlGroup(
+ const TDesC& aName,
+ TAMMSControlTypes aControlType) :
+ iName(aName),
+ iControlType(aControlType)
+{
+}
+
+// End of File