multimediacommsengine/mmcecli/src/mceinrefer.cpp
changeset 0 1bce908db942
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/multimediacommsengine/mmcecli/src/mceinrefer.cpp	Tue Feb 02 01:04:58 2010 +0200
@@ -0,0 +1,253 @@
+/*
+* 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 "mceinevent.h"
+#include "mceinrefer.h"
+#include "mceitcsender.h"
+#include "mceserial.h"
+#include "mceclilogs.h"
+
+// ============================ MEMBER FUNCTIONS ===============================
+
+
+
+// -----------------------------------------------------------------------------
+// CMceInRefer::~CMceInRefer
+// -----------------------------------------------------------------------------
+//
+EXPORT_C CMceInRefer::~CMceInRefer()
+    {
+    }
+
+// -----------------------------------------------------------------------------
+// CMceInRefer::AcceptL
+// -----------------------------------------------------------------------------
+//
+EXPORT_C CMceInEvent* CMceInRefer::AcceptL()
+    {
+    MCECLI_DEBUG("CMceInRefer::AcceptL, Entry");
+    TState state = State();
+    MCECLI_DEBUG_EVENTSTATE( "state", state );
+    
+    User::LeaveIfError( State() == EIdle ? KErrNone : KErrNotReady );
+    if ( ReferEvent() )
+        {
+        static_cast< CMceInEvent* >( ReferEvent() )->AcceptL();
+        
+        // resolve new state
+        iState = ResolveStateL();
+        }
+    else
+        {
+        TMceIds ids;
+	    PrepareForITC( ids );
+	    ids.iState = State();
+        iSender->SendL( ids, EMceItcAcceptEvent );
+        //update the state
+	    iState = static_cast< TState >( ids.iState );
+        }
+    state = State();
+    MCECLI_DEBUG_EVENTSTATE( "CMceInRefer::AcceptL, after ITC, state", state );
+    MCECLI_DEBUG("CMceInRefer::AcceptL, Exit");
+    
+	return static_cast< CMceInEvent* >( TransferEventOwnership() );
+    }
+
+// -----------------------------------------------------------------------------
+// CMceInRefer::RejectL
+// -----------------------------------------------------------------------------
+//
+EXPORT_C void CMceInRefer::RejectL()
+    {
+    MCECLI_DEBUG("CMceInRefer::RejectL, Entry");
+    TState state = State();
+    MCECLI_DEBUG_EVENTSTATE( "state", state );
+    
+    User::LeaveIfError( State() == EIdle ? KErrNone : KErrNotReady );
+    if ( ReferEvent() )
+        {
+        static_cast< CMceInEvent* >( ReferEvent() )->RejectL();
+        // resolve new state
+        iState = ResolveStateL();
+        }
+    else
+        {
+        TMceIds ids;
+	    PrepareForITC( ids );
+	    ids.iState = State();
+        iSender->SendL( ids, EMceItcRejectEvent );
+        //update the state
+	    iState = static_cast<TState>( ids.iState );	
+        }
+    state = State();
+    MCECLI_DEBUG_EVENTSTATE( "CMceInRefer::RejectL, after ITC, state", state );
+    MCECLI_DEBUG("CMceInRefer::RejectL, Exit");
+    
+	}
+
+
+// -----------------------------------------------------------------------------
+// CMceInRefer::RespondL
+// -----------------------------------------------------------------------------
+//
+EXPORT_C CMceInEvent* CMceInRefer::RespondL( 
+                        const TDesC8& aReason,
+			            TUint32 aCode,
+			            CDesC8Array* aHeaders,
+					    HBufC8* aContentType,
+					    HBufC8* aContent ) 
+    {
+    MCECLI_DEBUG("CMceInRefer::RespondL, Entry");
+    TState state = State();
+    MCECLI_DEBUG_EVENTSTATE( "state", state );
+    MCECLI_DEBUG_SVALUE( "reason", aReason );
+    MCECLI_DEBUG_DVALUE( "code", aCode );
+    
+    
+    User::LeaveIfError( State() == EIdle ? KErrNone : KErrNotReady );
+    User::LeaveIfError( 
+        ( aContentType && aContent ) || !( aContentType || aContent ) ? 
+        KErrNone : KErrArgument );
+    
+    if ( ReferEvent() )
+        {
+        static_cast< CMceInEvent* >( ReferEvent() )-> RespondL( aReason, 
+                                                                    aCode, 
+                                                                    aHeaders,
+                                                                    aContentType,
+                                                                    aContent );
+        // resolve new state
+        iState = ResolveStateL();	    
+        }
+    else
+        {
+        //copy reason
+        HBufC8* reason = aReason.AllocLC();
+	    //create reply
+	    CMceMsgSIPReply* reply = new (ELeave) CMceMsgSIPReply( *reason, 
+	                                                           aCode, 
+	                                                           *aHeaders, 
+	                                                           *aContentType );
+        CleanupStack::PushL( reply );
+    
+	    TMceIds ids;
+	    PrepareForITC( ids );
+	    ids.iState = State();
+	
+        iSender->SendL( ids, EMceItcRespondEvent , *reply, aContent );
+        
+        //update the state
+	    iState = static_cast<TState>( ids.iState );
+
+        //cleanup    
+        CleanupStack::PopAndDestroy( reply );
+        CleanupStack::PopAndDestroy( reason );
+        delete aHeaders;
+        delete aContentType;
+        }
+    state = State();
+    MCECLI_DEBUG_EVENTSTATE( "CMceInRefer::RespondL, after ITC, state", state );
+    MCECLI_DEBUG("CMceInRefer::RespondL, Exit");
+    
+    return ( iState == EPending ? 
+        static_cast< CMceInEvent* >( TransferEventOwnership() ) : NULL );
+    }
+
+// -----------------------------------------------------------------------------
+// CMceInRefer::NewL
+// -----------------------------------------------------------------------------
+//
+CMceInRefer* CMceInRefer::NewL( CMceManager& aManager,
+                                TUint32 aProfileId,
+                                CMceMsgSIPEvent& aEventMsg,
+                                CMceInEvent* aInEvent )
+    {
+    MCECLI_DEBUG("CMceInRefer::NewL, Entry");
+    MCECLI_DEBUG_DVALUE("profile", aProfileId );
+    
+    CMceInRefer* self = new (ELeave) CMceInRefer( 
+        aManager, 
+        aProfileId, 
+        aEventMsg.Id(), 
+        aEventMsg.DialogId(),
+        static_cast< TType > ( aEventMsg.ReferType() ) );
+        
+    CleanupStack::PushL( self );
+    
+    HBufC8* referTo = aEventMsg.ReferTo();
+    CleanupStack::PushL( referTo );
+    HBufC8* recipient = aEventMsg.Recipient();
+    CleanupStack::PushL( recipient );
+    HBufC8* originator = aEventMsg.Originator();
+    CleanupStack::PushL( originator );
+    
+    self->ConstructL( referTo, 
+                      recipient, 
+                      originator, 
+                      aInEvent );
+
+    CleanupStack::Pop( originator );
+    CleanupStack::Pop( recipient );
+    CleanupStack::Pop( referTo );
+    
+    CleanupStack::Pop( self );
+    MCECLI_DEBUG("CMceInRefer::NewL, Exit");
+    return self;
+    }
+
+
+// -----------------------------------------------------------------------------
+// CMceInRefer::CMceInRefer
+// -----------------------------------------------------------------------------
+//
+CMceInRefer::CMceInRefer( CMceManager& aManager, 
+                          TUint32 aProfileId,
+                          TUint32 aId,
+                          TUint32 aDialogId,
+                          TType aType )
+    : CMceRefer( aManager, aProfileId, aDialogId, aType )
+    {
+    iId = aId;
+    }
+    
+// -----------------------------------------------------------------------------
+// CMceInRefer::ConstructL
+// -----------------------------------------------------------------------------
+//
+void CMceInRefer::ConstructL( HBufC8* aReferTo,
+                              HBufC8* aRecipient,
+                              HBufC8* aOrginator,
+                              CMceInEvent* aInEvent ) 
+    {
+    iEvent = aInEvent; 
+    CMceRefer::ConstructL( aRecipient, aReferTo, aOrginator, NULL );
+    iEvent = NULL;
+    iOwnedEvent = aInEvent; 
+    }
+
+// -----------------------------------------------------------------------------
+// CMceInRefer::IsInRefer
+// -----------------------------------------------------------------------------
+//    
+TBool CMceInRefer::IsInRefer() const
+    {
+    return ETrue;
+    }
+