mmsharing/mmshavailability/src/musavacapabilitysipagent.cpp
changeset 22 496ad160a278
parent 0 f0cf47e981f9
child 31 33a5d2bbf6fc
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/mmsharing/mmshavailability/src/musavacapabilitysipagent.cpp	Fri Jun 11 13:36:18 2010 +0300
@@ -0,0 +1,260 @@
+/*
+* Copyright (c) 2005-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:   SIP event handling class
+*
+*/
+
+
+#include "musavacapabilitysipagent.h"
+#include <e32svr.h>
+#include <rconnmon.h>
+#include <sipdialog.h>
+#include <sipservertransaction.h>
+#include <sipclienttransaction.h>
+#include <sipdialogassocbase.h>
+#include <sipinvitedialogassoc.h>
+#include <sipregistrationbinding.h>
+#include <siprefresh.h>
+#include <sipstrings.h>
+#include <sipstrconsts.h>
+#include <sipresponseelements.h>
+
+#include "muslogger.h"
+#include "musavacapabilityexchange.h"
+#include "musavacapabilityquery.h"
+#include "musavaterminal.h"
+#include "musavasharedobject.h"
+#include "musavasip.h"
+#include "musavacapabilitycontext.h"
+#include "mmusavacapabilityqueryobserver.h"
+
+// --------------------------------------------------------------------------
+// C++ constructor
+// --------------------------------------------------------------------------
+//
+CMusAvaCapabilitySipAgent::CMusAvaCapabilitySipAgent( 
+                            CMusAvaCapabilityExchange& aCapabilityExchange,
+                            CMusAvaSharedObject& aSharedObject,
+                            MMusAvaAvailabilityObserver& aAvaObserver)
+    : iCapabilityExchange( aCapabilityExchange ),
+      iSharedObj( aSharedObject ),
+      iAvailabilityObserver( aAvaObserver )
+    {
+    }
+
+
+// --------------------------------------------------------------------------
+// Symbian two-phase constructor
+// --------------------------------------------------------------------------
+//
+CMusAvaCapabilitySipAgent* CMusAvaCapabilitySipAgent::NewL( 
+                            CMusAvaCapabilityExchange& aCapabilityExchange,
+                            CMusAvaSharedObject& aSharedObject,
+                            MMusAvaAvailabilityObserver& aAvaObserver)
+    {
+    MUS_LOG( "mus: [MUSAVA] -> CMusAvaCapabilitySipAgent::NewL" )
+    CMusAvaCapabilitySipAgent* self = 
+        new (ELeave) CMusAvaCapabilitySipAgent( aCapabilityExchange, 
+                                                aSharedObject,
+                                                aAvaObserver );
+    MUS_LOG( "mus: [MUSAVA] <- CMusAvaCapabilitySipAgent::NewL" )
+    return self;
+    }
+
+
+// --------------------------------------------------------------------------
+// C++ destructor
+// --------------------------------------------------------------------------
+//
+CMusAvaCapabilitySipAgent::~CMusAvaCapabilitySipAgent()
+    {
+    MUS_LOG( 
+    "mus: [MUSAVA] -> CMusAvaCapabilitySipAgent::~CMusAvaCapabilitySipAgent" )
+
+    delete iSipConnection;
+    
+    MUS_LOG( 
+    "mus: [MUSAVA] <- CMusAvaCapabilitySipAgent::~CMusAvaCapabilitySipAgent" )
+    }
+
+// --------------------------------------------------------------------------
+// CMusAvaCapabilitySipAgent::ExecuteCapabilityQueryL
+// --------------------------------------------------------------------------
+// 
+void CMusAvaCapabilitySipAgent::ExecuteCapabilityQueryL( 
+                                           CMusAvaCapability& aCapability, 
+                                           const TDesC& aSipAddress )
+    {
+    MUS_LOG( 
+    "mus: [MUSAVA] -> CMusAvaCapabilitySipAgent::ExecuteCapabilityQueryL" )
+
+    CSIPProfile* profile = iSharedObj.MusAvaSip().Profile();
+    if ( !profile )
+        {
+        User::Leave( KErrNotFound );
+        }
+
+    // Fetching connection leaves if profile is not registered for some reason,
+    // Thats what we want, forced creation of connection would activate PDP
+    // context although there's no reason to do that without registration.
+    CMusAvaCapabilityQuery* query = CMusAvaCapabilityQuery::NewL( 
+                                        aCapability,
+                                        *iSharedObj.MusAvaSip().ConnectionL( EFalse ), 
+                                        *profile, 
+                                        aSipAddress );
+    
+    CleanupStack::PushL( query );
+    
+    query->Terminal().ExecuteQueryL( query );
+    
+    CleanupStack::Pop( query );
+    
+    MUS_LOG( 
+    "mus: [MUSAVA] <- CMusAvaCapabilitySipAgent::ExecuteCapabilityQueryL" )
+    }
+
+// --------------------------------------------------------------------------
+// From MSIPObserver, incoming SIP request outside dialog is handled here
+// already.
+// --------------------------------------------------------------------------
+//
+
+TInt CMusAvaCapabilitySipAgent::IncomingRequest( TUint32 /*aIapId*/,
+                                    CSIPServerTransaction* /*aTransaction*/ )
+    {
+    MUS_LOG( 
+        "mus: [MUSAVA]  -> CMusAvaCapabilitySipAgent::IncomingRequest()" )
+    // If this method was called, there's no connection for this IAP
+    MUS_LOG( "mus: [MUSAVA]  if this method was called,\
+    	there's no capability" )
+    MUS_LOG( 
+        "mus: [MUSAVA]  <- CMusAvaCapabilitySipAgent::IncomingRequest()" )
+    return KErrNotFound;
+    }
+
+// -------------------------------------------------------------------------
+// SIP request timed-out and has been destroyed.
+// -------------------------------------------------------------------------
+//
+TInt CMusAvaCapabilitySipAgent::TimedOut(
+                                    CSIPServerTransaction& /*aTransaction*/ )
+    {
+    MUS_LOG( "mus: [MUSAVA]  -> CMusAvaCapabilitySipAgent::ConstructL()" )
+    MUS_LOG( "mus: [MUSAVA]  <- CMusAvaCapabilitySipAgent::ConstructL()" )
+    return KErrNotSupported;
+    }
+
+// --------------------------------------------------------------------------
+//  A SIP request outside a dialog has been received from the network.
+// --------------------------------------------------------------------------
+//
+TInt CMusAvaCapabilitySipAgent::IncomingRequest(
+                                        CSIPServerTransaction* aTransaction )
+    {
+    MUS_LOG( "mus: [MUSAVA] -> CMusAvaCapabilitySipAgent::IncomingRequest" )
+    TInt retval = KErrNone;
+    if ( aTransaction->Type() == 
+                        SIPStrings::StringF( SipStrConsts::EOptions ) )
+        {  
+        // Answer 200OK only when CS call remain at Availability States
+        if ( MMusAvaObserver::EMusAvaStatusNotExecuted <= 
+             iAvailabilityObserver.AvailabilityPluginState() )
+            {
+            retval = 
+             iCapabilityExchange.QueryObserver().CapabilityQueryAnswered() ?
+             KErrNotFound : KErrNone;
+        
+            if ( !retval )
+                {
+                MUS_LOG( "mus: [MUSAVA] Responding to OPTIONS" )
+                iCapabilityExchange.QueryReceived( aTransaction );
+                }
+            }
+        else
+            {
+            retval = KErrNotFound;
+            }
+        }
+    else        
+        {
+        MUS_LOG( "mus: [MUSAVA] Default response" )
+        TRAP_IGNORE( HandleIncomingRequestL( *aTransaction ) )
+        delete aTransaction;
+        MUS_LOG( "mus: [MUSAVA] Default response sent" )
+        }
+    MUS_LOG( "mus: [MUSAVA] <- CMusAvaCapabilitySipAgent::IncomingRequest" )
+    return retval;
+    }
+
+// --------------------------------------------------------------------------
+// From MSIPConnectionObserver, incoming SIP request outside dialog is 
+// handled here already.
+// --------------------------------------------------------------------------
+//
+void CMusAvaCapabilitySipAgent::HandleIncomingRequestL( 
+                                        CSIPServerTransaction& aTransaction )
+    {
+    MUS_LOG( 
+    "mus: [MUSAVA] -> CMusAvaCapabilitySipAgent::HandleIncomingRequestL" )
+    RStringF phrase = 
+                SIPStrings::StringF( SipStrConsts::EPhraseNotImplemented );
+    CSIPResponseElements* response = 
+        CSIPResponseElements::NewLC( KMUSAVASIPNotImplemented, phrase );
+    aTransaction.SendResponseL( response );
+    CleanupStack::Pop( response );
+    MUS_LOG( 
+    "mus: [MUSAVA] <- CMusAvaCapabilitySipAgent::HandleIncomingRequestL" )
+    }
+
+// --------------------------------------------------------------------------
+// CMusAvaCapabilitySipAgent::IncomingResponse
+// --------------------------------------------------------------------------
+//
+TInt CMusAvaCapabilitySipAgent::IncomingResponse( 
+                                        CSIPClientTransaction& aTransaction )
+    {
+    MUS_LOG( 
+        "mus: [MUSAVA] -> CMusAvaCapabilitySipAgent::IncomingResponse" )
+    iCapabilityExchange.AnswerToQueryReceived( aTransaction );
+    MUS_LOG( 
+        "mus: [MUSAVA] <- CMusAvaCapabilitySipAgent::IncomingResponse" )
+    return KErrNone;
+    }
+    
+// --------------------------------------------------------------------------
+// CMusAvaCapabilitySipAgent::ErrorOccured
+// --------------------------------------------------------------------------
+//
+TInt CMusAvaCapabilitySipAgent::ErrorOccured( TInt aError,
+                                        CSIPTransactionBase& aTransaction )
+    {
+    MUS_LOG( "mus: [MUSAVA] -> CMusAvaCapabilitySipAgent:.ErrorOccured" )
+    
+    if ( aTransaction.IsSIPClientTransaction() )
+        {
+        MUS_LOG( "mus: [MUSAVA] Canceling query" )
+        
+        iCapabilityExchange.CancelQuery( 
+                aError, 
+                static_cast<CSIPClientTransaction&>( aTransaction ) );
+        }
+    else
+        {
+        MUS_LOG( "mus: [MUSAVA] Server transaction, nothing to do" )
+        }
+        
+    MUS_LOG( "mus: [MUSAVA] <- CMusAvaCapabilitySipAgent:.ErrorOccured" )
+    return KErrNone;
+    }
+