mmfenh/enhancedmediaclient/Client/src/Components/EffectBase/EffectControlBaseImpl.cpp
changeset 0 71ca22bcf22a
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/mmfenh/enhancedmediaclient/Client/src/Components/EffectBase/EffectControlBaseImpl.cpp	Tue Feb 02 01:08:46 2010 +0200
@@ -0,0 +1,418 @@
+/*
+* Copyright (c) 2006 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:  Implementation of EffectControlBaseImpl class.
+*
+*/
+
+#include <StreamControl.h>
+#include <MCustomCommand.h>
+#include <ControlObserver.h>
+#include <EffectControl.h>
+#include <VolumeControl.h>
+
+#include "CustomInterfaceBuilderTypes.h"
+#include "EffectControlBaseImpl.h"
+#include "EffectControlBase.h"
+
+const TUid KUidCIFBuilderParser = {0x10207B29};
+
+using namespace multimedia;
+
+CEffectControlBaseImpl::CEffectControlBaseImpl( CEffectControlBase& aParent, TUid aCIUid )
+: CActive(CActive::EPriorityStandard),
+  iParent(aParent),
+  iCIUid(aCIUid),
+  iStreamControl(NULL),
+  iCustomCommand(NULL),
+  iEffect(NULL)
+    {
+    CActiveScheduler::Add(this);
+    }
+
+CEffectControlBaseImpl::~CEffectControlBaseImpl()
+    {
+    Cancel();
+    // Signal MStreamControl if this effect class is deleted before
+    // removing from it
+    if ( iStreamControl )
+        {
+        iStreamControl->RemoveEffect( *iEffect );
+        };
+    }
+
+CEffectControlBaseImpl* CEffectControlBaseImpl::NewL( CEffectControlBase& aParent, TUid aCIUid )
+    {
+    CEffectControlBaseImpl* self = new (ELeave) CEffectControlBaseImpl( aParent, aCIUid );
+    CleanupStack::PushL( self );
+    self->ConstructL();
+    CleanupStack::Pop( self );
+    return self;
+    }
+
+void CEffectControlBaseImpl::ConstructL()
+    {
+    // No impl yet
+    }
+
+TInt CEffectControlBaseImpl::AddedToStreamControl( MStreamControl& aStreamControl,
+                                                   MCustomCommand& aCustomCommand,
+                                                   MEffectControl& aEffect )
+    {
+    TInt status(KErrAlreadyExists);
+    if ( !iStreamControl )
+        {
+        iStreamControl = &aStreamControl;
+        iCustomCommand = &aCustomCommand;
+        iEffect = &aEffect;
+        status = KErrNone;
+        }
+
+	// This is done here to get the MessageHandler if the Controller
+	// is already loaded, otherwise we dont return an Error from Connect    
+    if(iMsgHndlrHandlePckg().InterfaceId() == KNullUid)
+    	{
+		status = Connect();
+		if(status == KErrNone)
+	        {
+/*
+	        // This results in subclasses getting notification asynchronously.
+	        // In the mean time clients may already start setting attributes on
+	        // effect objects which will be lost if proxy is not created
+	        // In order to eliminate this possibility, notify synchronously
+	        CActive::Cancel();
+	        CActive::SetActive();
+	        TRequestStatus* status = &iStatus;
+			User::RequestComplete( status, EControllerLoaded );			
+*/
+	        iParent.Event( CEffectControlBase::ECIBuilderCreated );
+	        }
+	    else
+	    	{
+	    	// This Error is Overwritten because the Connect failed.
+	    	// Its ok here since we are just checking if the controller
+	    	// is loaded and the msghandler created.	
+	    	status = KErrNone;	
+	    	}    
+        }
+
+    return status;
+    }
+
+TInt CEffectControlBaseImpl::RemovedFromStreamControl( MStreamControl& /*aStreamControl*/ )
+    {
+    Disconnect();	
+    iStreamControl = NULL;
+    iCustomCommand = NULL;
+    iEffect = NULL;
+    return KErrNone;
+    }
+
+void CEffectControlBaseImpl::StreamControlDeleted( MStreamControl& /*aStreamControl*/ )
+    {
+    iStreamControl = NULL;
+    iCustomCommand = NULL;
+    iMsgHndlrHandlePckg().InterfaceId() = KNullUid;
+    }
+
+TBool CEffectControlBaseImpl::IsConnected()
+    {
+    if ( iMsgHndlrHandlePckg().InterfaceId() != KNullUid )
+        {
+        return ETrue;
+        }
+    else
+        {
+        return EFalse;
+        }
+    }
+
+TInt CEffectControlBaseImpl::Connect()
+    {
+    TInt status(KErrNone);
+	
+	// Since the Volume Effect does not have Proxy 
+	// and message handler we return here only
+	if(iEffect->Type() == KVolumeEffectControl)
+		{
+		return KErrNone;	
+		}
+	
+	if(!iCustomCommand)
+		{
+		return KErrNotReady;	
+		}
+	
+	TMMFMessageDestination     destination(KUidCustomInterfaceBuilder);
+	TMMFMessageDestinationPckg destinationPckg(destination);
+
+    if ( iMsgHndlrHandlePckg().InterfaceId() == KNullUid )
+        {
+
+        status = iCustomCommand->CustomCommandSync(destinationPckg, ECibGetBuilder, KNullDesC8, KNullDesC8, iBuilderHandle);
+
+		if(iBuilderHandle().InterfaceId() == KNullUid || status != KErrNone)
+			{
+			return status;
+			}
+		
+        // Get handle to message handler from CI Bldr parser
+        status = BuilderParserMessage(ECIFCreateMessageHandler);
+        if( iMsgHndlrHandlePckg().InterfaceId() == KNullUid )
+            {
+            status = KErrNotSupported;
+            }
+        }
+
+    return status;
+    }
+
+TInt CEffectControlBaseImpl::Disconnect()
+    {
+    TInt status(KErrNotReady);
+    if ( ( iMsgHndlrHandlePckg().InterfaceId() != KNullUid ) && (iCustomCommand) )
+        {
+        // Get handle to message handler from CI Bldr parser
+        status = BuilderParserMessage(ECIFRemoveMessageHandler);
+		// This is done here since the Interface ID is not set to NULL when
+		// we set it using KNullUid.
+		TMMFMessageDestination temp;	    
+        iMsgHndlrHandlePckg() = temp;
+        }
+    return status;
+    }
+
+TInt CEffectControlBaseImpl::CustomCommandSync(TInt aFunction,
+                       const TDesC8& aDataTo1,
+                       const TDesC8& aDataTo2,
+                       TDes8& aDataFrom)
+    {
+    return CustomCommandSync( iMsgHndlrHandlePckg,
+                              aFunction,
+                              aDataTo1,
+                              aDataTo2,
+                              aDataFrom );
+    }
+
+TInt CEffectControlBaseImpl::CustomCommandSync(TInt aFunction,
+                       const TDesC8& aDataTo1,
+                       const TDesC8& aDataTo2)
+    {
+    return CustomCommandSync( iMsgHndlrHandlePckg,
+                              aFunction,
+                              aDataTo1,
+                              aDataTo2 );
+    }
+
+void CEffectControlBaseImpl::CustomCommandAsync(TInt aFunction,
+                        const TDesC8& aDataTo1,
+                        const TDesC8& aDataTo2,
+                        TDes8& aDataFrom,
+                        TRequestStatus& aStatus)
+    {
+    CustomCommandAsync( iMsgHndlrHandlePckg,
+                        aFunction,
+                        aDataTo1,
+                        aDataTo2,
+                        aDataFrom,
+                        aStatus );
+    }
+
+void CEffectControlBaseImpl::CustomCommandAsync(TInt aFunction,
+                        const TDesC8& aDataTo1,
+                        const TDesC8& aDataTo2,
+                        TRequestStatus& aStatus)
+    {
+    CustomCommandAsync( iMsgHndlrHandlePckg,
+                        aFunction,
+                        aDataTo1,
+                        aDataTo2,
+                        aStatus );
+    }
+
+TInt CEffectControlBaseImpl::CustomCommandSync( const TMMFMessageDestinationPckg& aDestination,
+                                                TInt aFunction,
+                                                const TDesC8& aDataTo1,
+                                                const TDesC8& aDataTo2,
+                                                TDes8& aDataFrom )
+    {
+    TInt status(KErrNotReady);
+    if ( ( iCustomCommand ) && ( aDestination().InterfaceId() != KNullUid ) )
+        {
+        status = iCustomCommand->CustomCommandSync( aDestination,
+                                                    aFunction,
+                                                    aDataTo1,
+                                                    aDataTo2,
+                                                    aDataFrom );
+        }
+    return status;
+    }
+
+TInt CEffectControlBaseImpl::CustomCommandSync( const TMMFMessageDestinationPckg& aDestination,
+                                                TInt aFunction,
+                                                const TDesC8& aDataTo1,
+                                                const TDesC8& aDataTo2 )
+    {
+    TInt status(KErrNotReady);
+    if ( ( iCustomCommand ) && ( aDestination().InterfaceId() != KNullUid ) )
+        {
+        status = iCustomCommand->CustomCommandSync( aDestination,
+                                                    aFunction,
+                                                    aDataTo1,
+                                                    aDataTo2 );
+        }
+    return status;
+    }
+
+void CEffectControlBaseImpl::CustomCommandAsync( const TMMFMessageDestinationPckg& aDestination,
+                                                 TInt aFunction,
+                                                 const TDesC8& aDataTo1,
+                                                 const TDesC8& aDataTo2,
+                                                 TDes8& aDataFrom,
+                                                 TRequestStatus& aStatus )
+    {
+    if ( ( iCustomCommand ) && ( aDestination().InterfaceId() != KNullUid ) )
+        {
+        iCustomCommand->CustomCommandAsync( aDestination,
+                                            aFunction,
+                                            aDataTo1,
+                                            aDataTo2,
+                                            aDataFrom,
+                                            aStatus );
+        }
+    else
+        {
+        TRequestStatus* status = &aStatus;
+		User::RequestComplete(status, KErrNotReady);
+        }
+    }
+
+void CEffectControlBaseImpl::CustomCommandAsync( const TMMFMessageDestinationPckg& aDestination,
+                                                 TInt aFunction,
+                                                 const TDesC8& aDataTo1,
+                                                 const TDesC8& aDataTo2,
+                                                 TRequestStatus& aStatus )
+
+    {
+    if ( ( iCustomCommand ) && ( aDestination().InterfaceId() != KNullUid ) )
+        {
+        iCustomCommand->CustomCommandAsync( aDestination,
+                                            aFunction,
+                                            aDataTo1,
+                                            aDataTo2,
+                                            aStatus );
+        }
+    else
+        {
+        TRequestStatus* status = &aStatus;
+		User::RequestComplete(status, KErrNotReady);
+        }    
+    }
+
+TInt CEffectControlBaseImpl::GetMessageHandle(TMMFMessageDestinationPckg &aPckg)
+	{
+    TInt status(KErrNone);
+    aPckg = iMsgHndlrHandlePckg;
+    return status;		
+	}
+
+MCustomCommand* CEffectControlBaseImpl::GetCustomCommand()
+	{
+    return iCustomCommand;
+	}
+	
+void CEffectControlBaseImpl::RunL()
+    {    
+    TInt status(KErrNone);	 
+    if ( iStatus.Int() == EControllerLoaded )
+        {
+        status = Connect();
+        if(status == KErrNone)
+        	{
+        	iParent.Event( CEffectControlBase::ECIBuilderCreated );
+        	}
+        }
+    else if ( iStatus.Int() == EControllerUnloaded )
+        {
+        status = Disconnect();
+        if(status == KErrNone)
+        	{
+        	iParent.Event( CEffectControlBase::EMessageHandlerDeleted );
+        	}
+        }
+    }
+
+void CEffectControlBaseImpl::DoCancel()
+    {
+    // Do Nothing
+    }
+
+TInt CEffectControlBaseImpl::RunError( TInt /*aError*/ )
+    {
+    // RunL should never leave, if it did that means
+    // the code left during event handling
+    return KErrNone;
+    }
+
+void CEffectControlBaseImpl::Event( MControl* /*aControl*/, TUint aEventType, TAny* /*aEventObject*/ )
+    {
+    if ( aEventType == EControllerLoaded )
+        {
+        CActive::Cancel();
+        CActive::SetActive();
+        TRequestStatus* status = &iStatus;
+		User::RequestComplete( status, EControllerLoaded );
+        }
+    else if ( aEventType == EControllerUnloaded )
+        {
+        CActive::Cancel();
+        CActive::SetActive();
+        TRequestStatus* status = &iStatus;
+		User::RequestComplete( status, EControllerUnloaded );
+        }
+    }
+
+TInt CEffectControlBaseImpl::BuilderParserMessage(CIFBuilderParserFunctions aCommand)
+    {
+    TInt status(KErrNotReady);
+    if ( iCustomCommand )
+        {
+        TMMFMessageDestination     ciBldr(KUidCIFBuilderParser);
+        TMMFMessageDestinationPckg ciBldrPckg(ciBldr);
+        TPckgBuf<TUid> uidPckg;
+        uidPckg() = iCIUid;
+        switch (aCommand)
+            {
+            case ECIFCreateMessageHandler:
+            status = iCustomCommand->CustomCommandSync( iBuilderHandle,
+                                                        ECibBuild,
+                                                        uidPckg,
+                                                        KNullDesC8,
+                                                        iMsgHndlrHandlePckg);
+                break;
+            case ECIFRemoveMessageHandler:
+            status = iCustomCommand->CustomCommandSync( iBuilderHandle,
+                                                        ECibRemove,
+                                                        iMsgHndlrHandlePckg,
+                                                        KNullDesC8);
+                break;
+            default:
+                status = KErrUnknown;
+                break;
+            };
+        }
+    return status;
+    }
+
+
+// End of file