multimediacommsengine/mmcecli/src/mceoutevent.cpp
changeset 0 1bce908db942
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/multimediacommsengine/mmcecli/src/mceoutevent.cpp	Tue Feb 02 01:04:58 2010 +0200
@@ -0,0 +1,368 @@
+/*
+* 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:    
+*
+*/
+
+
+
+
+#include <sipprofile.h>
+#include "mceoutevent.h"
+#include "mcesession.h"
+#include "mcerefer.h"
+#include "mcemanager.h"
+#include "mceclientserver.h"
+#include "mceitcsender.h"
+#include "mceserial.h"
+#include "mceclilogs.h"
+
+// ============================ MEMBER FUNCTIONS ===============================
+
+
+// -----------------------------------------------------------------------------
+// CMceOutEvent::NewL
+// -----------------------------------------------------------------------------
+//
+EXPORT_C CMceOutEvent* CMceOutEvent::NewL(
+					        CMceManager& aManager,
+					        CSIPProfile& aProfile,
+					        const TDesC8& aRecipient,
+							const TDesC8& aEventHeader,
+		    				TUint32 aRefreshInterval,
+					        HBufC8* aOriginator ) 
+    {
+    MCECLI_DEBUG("CMceOutEvent::NewL, Entry");
+    MCECLI_DEBUG_SVALUE("recipient", aRecipient );
+    MCECLI_DEBUG_SVALUE("event header", aEventHeader );
+    
+    TUint32 profileId(0);
+    if ( aProfile.GetParameter( KSIPProfileId, profileId ) != KErrNone )
+        {
+        User::Leave(KErrNotFound);
+        }
+
+    CMceOutEvent* self = new (ELeave) CMceOutEvent( aManager, 
+                                                    profileId,
+                                                    KMceNotAssigned,
+                                                    aRefreshInterval );
+    CleanupStack::PushL( self );
+    self->ConstructL( aEventHeader, 
+                      aRecipient, 
+                      aOriginator, 
+                      KMceDlgTypeSubscribe,
+                      NULL );
+    CleanupStack::Pop( self );
+    MCECLI_DEBUG("CMceOutEvent::NewL, Exit");
+    return self;  
+    }
+    
+// -----------------------------------------------------------------------------
+// CMceOutEvent::NewL
+// -----------------------------------------------------------------------------
+//    
+EXPORT_C CMceOutEvent* CMceOutEvent::NewL(
+					  CMceEvent& aEvent,
+					  const TDesC8& aEventHeader,
+		    		  TUint32 aRefreshInterval )
+    {
+    MCECLI_DEBUG("CMceOutEvent::NewL, Entry");
+    MCECLI_DEBUG_DVALUE("event", aEvent.Id() );
+    MCECLI_DEBUG_SVALUE("event header", aEventHeader );
+    
+    CMceOutEvent* self = new (ELeave) CMceOutEvent( aEvent.Manager(), 
+                                                    aEvent.ProfileId(),
+                                                    aEvent.DialogId(),
+                                                    aRefreshInterval );
+    CleanupStack::PushL( self );
+    
+    self->ConstructL( aEventHeader, 
+                      aEvent.Recipient(), 
+                      aEvent.Originator(),
+                      KMceDlgTypeSubscribe );
+    CleanupStack::Pop( self );
+    MCECLI_DEBUG("CMceOutEvent::NewL, Exit");
+    return self;  
+    }
+
+// -----------------------------------------------------------------------------
+// CMceOutEvent::NewL
+// -----------------------------------------------------------------------------
+//        
+EXPORT_C CMceOutEvent* CMceOutEvent::NewL(
+					  CMceSession& aSession,
+					  const TDesC8& aEventHeader,
+		    		  TUint32 aRefreshInterval )
+    {
+    MCECLI_DEBUG("CMceOutEvent::NewL, Entry");
+    MCECLI_DEBUG_DVALUE("session", aSession.Id() );
+    MCECLI_DEBUG_SVALUE("event header", aEventHeader );
+    
+    CMceOutEvent* self = new (ELeave) CMceOutEvent( aSession.Manager(), 
+                                                    aSession.Profile(),
+                                                    aSession.DialogId(),
+                                                    aRefreshInterval );
+    CleanupStack::PushL( self );
+    self->ConstructL( aEventHeader, 
+                      aSession.Recipient(), 
+                      aSession.Originator(),
+                      KMceDlgTypeSubscribe );
+    CleanupStack::Pop( self );
+    
+    MCECLI_DEBUG("CMceOutEvent::NewL, Exit");
+    
+    return self; 
+    }
+
+// -----------------------------------------------------------------------------
+// CMceOutEvent::NewL
+// -----------------------------------------------------------------------------
+//    
+EXPORT_C CMceOutEvent* CMceOutEvent::NewL(
+					  CMceRefer& aRefer,
+					  const TDesC8& aEventHeader,
+		    		  TUint32 aRefreshInterval )
+    {
+    MCECLI_DEBUG("CMceOutEvent::NewL, Entry");
+    MCECLI_DEBUG_DVALUE("refer", aRefer.Id() );
+    MCECLI_DEBUG_SVALUE("event header", aEventHeader );
+    
+    CMceOutEvent* self = new (ELeave) CMceOutEvent( aRefer.Manager(), 
+                                                    aRefer.ProfileId(),
+                                                    aRefer.DialogId(),
+                                                    aRefreshInterval );
+    CleanupStack::PushL( self );
+    self->ConstructL( aEventHeader, 
+                      aRefer.Recipient(), 
+                      aRefer.Originator(),
+                      KMceDlgTypeSubscribe );
+    CleanupStack::Pop( self );
+    MCECLI_DEBUG("CMceOutEvent::NewL, Exit");
+    
+    return self;  
+    }
+
+// -----------------------------------------------------------------------------
+// CMceOutEvent::NewL
+// -----------------------------------------------------------------------------
+//
+CMceOutEvent* CMceOutEvent::NewL(
+					        CMceManager& aManager,
+					        TUint32 aProfileId,
+					        const TDesC8& aRecipient,
+							const TDesC8& aEventHeader,
+		    				TUint32 aRefreshInterval,
+					        HBufC8* aOriginator,
+					        TUint32 aDialogId,
+					        TUint32 aDialogType,
+					        CDesC8Array* aParams ) 
+    {
+    MCECLI_DEBUG("CMceOutEvent::NewL, Entry");
+    MCECLI_DEBUG_DVALUE("profile", aProfileId );
+    MCECLI_DEBUG_SVALUE("recipient", aRecipient );
+    MCECLI_DEBUG_SVALUE("event header", aEventHeader );
+    MCECLI_DEBUG_DVALUE("dialog id", aDialogId );
+        
+    CMceOutEvent* self = new (ELeave) CMceOutEvent( aManager, 
+                                                    aProfileId,
+                                                    aDialogId,
+                                                    aRefreshInterval );
+    CleanupStack::PushL( self );
+    self->ConstructL( aEventHeader, 
+                      aRecipient, 
+                      aOriginator, 
+                      aDialogType,
+                      aParams );
+    CleanupStack::Pop( self );
+    MCECLI_DEBUG("CMceOutEvent::NewL, Exit");
+    return self;  
+    }
+ 
+// -----------------------------------------------------------------------------
+// CMceOutEvent::~CMceOutEvent
+// -----------------------------------------------------------------------------
+//
+EXPORT_C CMceOutEvent::~CMceOutEvent()
+    {
+    }
+
+// -----------------------------------------------------------------------------
+// CMceOutEvent::SubscribeL
+// -----------------------------------------------------------------------------
+//
+EXPORT_C void CMceOutEvent::SubscribeL(
+			 CDesC8Array* aHeaders,
+			 HBufC8* aContentType,
+			 HBufC8* aContent )
+    {
+    MCECLI_DEBUG("CMceOutEvent::SubscribeL, Entry");
+    TUint state = State();
+    MCECLI_DEBUG_EVENTSTATE( "state", state );
+    
+    User::LeaveIfError( State() == EIdle ? KErrNone : KErrNotReady );
+    User::LeaveIfError( 
+        ( aContentType && aContent ) || !( aContentType || aContent ) ? 
+        KErrNone : KErrArgument );
+    
+	TMceIds ids;
+	PrepareForITC( ids );
+	ids.iState = State();
+    
+    CMceMsgSIPEvent* subscribe = NULL;
+    // stand alone
+    subscribe = new (ELeave) CMceMsgSIPEvent(  iId,
+                                   iDialogId,
+                                   EMceItcEventTypeSubscribe,
+                                   CMceRefer::ENoSuppression, 
+                                   iRefreshInterval,
+                                   aHeaders,
+                                   aContentType );
+        
+    CleanupStack::PushL( subscribe );
+    subscribe->OwnershipRollbackPushLC();
+    
+    iSender->SendL( ids, EMceItcSubscribe , *subscribe, aContent );
+    
+    CleanupStack::Pop(); // subscribe->OwnershipRollbackPushLC()
+    CleanupStack::PopAndDestroy( subscribe );
+    
+    iState = static_cast<TState>( ids.iState );
+    state = State();
+    MCECLI_DEBUG_EVENTSTATE( "CMceEvent::SubscribeL, after ITC, state", state );
+    MCECLI_DEBUG("CMceEvent::SubscribeL, Exit");
+    }
+
+// -----------------------------------------------------------------------------
+// CMceOutEvent::CMceOutEvent
+// -----------------------------------------------------------------------------
+//
+CMceOutEvent::CMceOutEvent( CMceManager& aManager, 
+                            TUint32 aProfileId,
+                            TUint32 aDialogId,
+                            TUint32 aRefreshInterval )
+    : CMceEvent( aManager, aProfileId, aDialogId, aRefreshInterval )
+    {
+    }
+
+// -----------------------------------------------------------------------------
+// CMceOutEvent::ConstructL
+// -----------------------------------------------------------------------------
+//
+void CMceOutEvent::ConstructL( const TDesC8& aEventHeader, 
+                               const TDesC8& aRecipient, 
+                               HBufC8* aOriginator,
+                               TUint32 aDialogType,
+                               CDesC8Array* aParams )
+    {
+    HBufC8* eventHeader = aEventHeader.AllocLC();
+    HBufC8* recipient = aRecipient.AllocLC();
+ 
+    CMceEvent::ConstructL( eventHeader, 
+                           recipient, 
+                           aOriginator,
+                           aDialogType,
+                           aParams );    
+    
+    CleanupStack::Pop( recipient );
+    CleanupStack::Pop( eventHeader );
+    }
+
+// -----------------------------------------------------------------------------
+// CMceOutEvent::ConstructL
+// -----------------------------------------------------------------------------
+//
+void CMceOutEvent::ConstructL( const TDesC8& aEventHeader, 
+                               const TDesC8& aRecipient, 
+                               const TDesC8& aOriginator,
+                               TUint32 aDialogType )
+    {
+    HBufC8* eventHeader = aEventHeader.AllocLC();
+    HBufC8* recipient = aRecipient.AllocLC();
+    HBufC8* originator = aOriginator.AllocLC();
+    
+    CMceEvent::ConstructL( eventHeader, 
+                           recipient, 
+                           originator,
+                           aDialogType,
+                           NULL );
+                           
+    CleanupStack::Pop( originator ); 
+    CleanupStack::Pop( recipient );
+    CleanupStack::Pop( eventHeader ); 
+    }
+    
+// -----------------------------------------------------------------------------
+// CMceOutEvent::UpdateL
+// -----------------------------------------------------------------------------
+//
+EXPORT_C void CMceOutEvent::UpdateL( TUint32 aRefreshInterval,
+                                     CDesC8Array* aHeaders,
+			                         HBufC8* aContentType,
+				                     HBufC8* aContent )
+    {
+    MCECLI_DEBUG("CMceOutEvent::UpdateL, Entry");
+    TUint state = State();
+    MCECLI_DEBUG_EVENTSTATE( "state", state );
+    
+    User::LeaveIfError( aRefreshInterval > 0 ? KErrNone : KErrArgument );
+    User::LeaveIfError( State() == EActive ? KErrNone : KErrNotReady );
+    User::LeaveIfError( 
+        ( aContentType && aContent ) || !( aContentType || aContent ) ? 
+        KErrNone : KErrArgument );
+    
+    CMceRefer* refer = iManager.FindRefer( *this );
+    if ( refer )
+        {
+        // Updating not supported for event attached to refer.
+        User::Leave( KErrNotSupported ); 
+        }
+    
+    iRefreshInterval = aRefreshInterval;
+    
+	TMceIds ids; 
+	PrepareForITC( ids );
+	ids.iState = State();
+	
+	CMceMsgSIPEvent* update = 
+	    new (ELeave) CMceMsgSIPEvent(  iId,
+	                                   iDialogId,
+	                                   EMceItcEventTypeSubscribe,
+	                                   CMceRefer::ENoSuppression, 
+                                       iRefreshInterval,
+                                       aHeaders,
+                                       aContentType );
+    CleanupStack::PushL( update );
+    update->OwnershipRollbackPushLC();
+    
+    iSender->SendL( ids, EMceItcSubscribeUpdate, *update, aContent );    
+    
+    CleanupStack::Pop(); // update->OwnershipRollbackPushLC()
+    CleanupStack::PopAndDestroy( update );
+    
+	iState = static_cast<TState>( ids.iState );
+
+	state = State();
+    MCECLI_DEBUG_EVENTSTATE( "CMceEvent::UpdateL, after ITC, state", state );
+    MCECLI_DEBUG("CMceEvent::SubscribeL, Exit");
+	
+    }
+
+// -----------------------------------------------------------------------------
+// CMceOutEvent::IsInEvent
+// -----------------------------------------------------------------------------
+//
+TBool CMceOutEvent::IsInEvent() const
+	{
+	return EFalse;
+	}