--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/mmsharing/mmshavailability/src/musavasipconnectionobserver.cpp Thu Dec 17 08:44:37 2009 +0200
@@ -0,0 +1,402 @@
+/*
+* Copyright (c) 2005-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: mussipobserver is SIP API observer class for the MUS availability plug-in.
+*
+*/
+
+
+
+#include "musunittesting.h"
+#include "musavasipconnectionobserver.h"
+#include "musavasipconnectionadapter.h"
+#include "musavasipdefaulthandler.h"
+#include "musavasip.h"
+#include "muslogger.h"
+
+#include <e32std.h>
+#include <sipconnectionobserver.h>
+#include <sipservertransaction.h>
+#include <sipinvitedialogassoc.h>
+
+
+
+
+// -----------------------------------------------------------------------------
+// Two-phased constructor.
+// -----------------------------------------------------------------------------
+CMusAvaSipConnectionObserver* CMusAvaSipConnectionObserver::NewL()
+ {
+ CMusAvaSipConnectionObserver* self =
+ new( ELeave ) CMusAvaSipConnectionObserver();
+ CleanupStack::PushL( self );
+ self->ConstructL();
+ CleanupStack::Pop( self );
+ return self;
+ }
+
+
+// Destructor
+CMusAvaSipConnectionObserver::~CMusAvaSipConnectionObserver()
+ {
+ delete iDefaultHandler;
+ iObservers.Reset();
+ iObservers.Close();
+ }
+
+
+// -----------------------------------------------------------------------------
+// A SIP request outside a dialog has been received from the network.
+// -----------------------------------------------------------------------------
+void CMusAvaSipConnectionObserver::IncomingRequest(
+ CSIPServerTransaction* aTransaction )
+ {
+ for( TInt i=0; i<iObservers.Count(); i++ )
+ {
+ TInt retval( KErrNotFound );
+ retval = iObservers[i]->IncomingRequest( aTransaction );
+ if( retval == KErrNone)
+ {
+ return;
+ }
+ }
+ }
+
+
+// -----------------------------------------------------------------------------
+// A SIP request within a dialog has been received from the network.
+// -----------------------------------------------------------------------------
+void CMusAvaSipConnectionObserver::IncomingRequest(
+ CSIPServerTransaction* aTransaction,
+ CSIPDialog& aSIPDialog )
+
+ {
+ for( TInt i=0; i<iObservers.Count(); i++ )
+ {
+ TInt retval( KErrNotFound );
+ retval = iObservers[i]->IncomingRequest( aTransaction, aSIPDialog );
+ if( retval == KErrNone)
+ {
+ return;
+ }
+ }
+ }
+
+
+// -----------------------------------------------------------------------------
+// A SIP response that is within a dialog association or creates a
+// dialog association.
+// -----------------------------------------------------------------------------
+void CMusAvaSipConnectionObserver::IncomingResponse(
+ CSIPClientTransaction& aTransaction )
+ {
+ for( TInt i=0; i<iObservers.Count(); i++ )
+ {
+ TInt retval( KErrNotFound );
+ retval = iObservers[i]->IncomingResponse( aTransaction );
+ if( retval == KErrNone)
+ {
+ return;
+ }
+ }
+ }
+
+
+// -----------------------------------------------------------------------------
+// A SIP response that is within a dialog association or creates a
+// dialog association.
+// -----------------------------------------------------------------------------
+void CMusAvaSipConnectionObserver::IncomingResponse(
+ CSIPClientTransaction& aTransaction,
+ CSIPDialogAssocBase& aDialogAssoc)
+ {
+ for( TInt i=0; i<iObservers.Count(); i++ )
+ {
+ TInt retval( KErrNotFound );
+ retval = iObservers[i]->IncomingResponse( aTransaction, aDialogAssoc );
+ if( retval == KErrNone)
+ {
+ return;
+ }
+ }
+ }
+
+
+// -----------------------------------------------------------------------------
+// Multiple SIP responses have been received to the single INVITE.
+// -----------------------------------------------------------------------------
+void CMusAvaSipConnectionObserver::IncomingResponse(
+ CSIPClientTransaction& aTransaction,
+ CSIPInviteDialogAssoc* aDialogAssoc )
+ {
+ for( TInt i=0; i<iObservers.Count(); i++ )
+ {
+ TInt retval( KErrNotFound );
+ retval = iObservers[i]->IncomingResponse( aTransaction, aDialogAssoc );
+ if( retval == KErrNone)
+ {
+ return;
+ }
+ }
+ }
+
+
+// -----------------------------------------------------------------------------
+// SIP stack has completed UAC core INVITE transaction.
+// -----------------------------------------------------------------------------
+void CMusAvaSipConnectionObserver::InviteCompleted(
+ CSIPClientTransaction& aTransaction )
+ {
+ for( TInt i=0; i<iObservers.Count(); i++ )
+ {
+ TInt retval( KErrNotFound );
+ retval = iObservers[i]->InviteCompleted( aTransaction );
+ if( retval == KErrNone)
+ {
+ return;
+ }
+ }
+ }
+
+
+// -----------------------------------------------------------------------------
+// A SIP response creating a registration binding or an error response
+// that is related to an existing refreshed registration binding has
+// been received from the network.
+// -----------------------------------------------------------------------------
+void CMusAvaSipConnectionObserver::IncomingResponse(
+ CSIPClientTransaction& aTransaction,
+ CSIPRegistrationBinding& aRegistration )
+ {
+ for( TInt i=0; i<iObservers.Count(); i++ )
+ {
+ TInt retval( KErrNotFound );
+ retval = iObservers[i]->IncomingResponse( aTransaction, aRegistration );
+ if( retval == KErrNone)
+ {
+ return;
+ }
+ }
+ }
+
+
+// -----------------------------------------------------------------------------
+// An asynchronous error has occurred in the stack related to the
+// request indicated by the given transaction.
+// -----------------------------------------------------------------------------
+void CMusAvaSipConnectionObserver::ErrorOccured(
+ TInt aError,
+ CSIPTransactionBase& aTransaction )
+ {
+ for( TInt i=0; i<iObservers.Count(); i++ )
+ {
+ TInt retval( KErrNotFound );
+ retval = iObservers[i]->ErrorOccured( aError, aTransaction );
+ if( retval == KErrNone)
+ {
+ return;
+ }
+ }
+ }
+
+
+// -----------------------------------------------------------------------------
+// An asynchronous error has occurred in the stack related to the
+// request indicated by the given transaction.
+// -----------------------------------------------------------------------------
+void CMusAvaSipConnectionObserver::ErrorOccured(
+ TInt aError,
+ CSIPClientTransaction& aTransaction,
+ CSIPRegistrationBinding& aRegistration )
+ {
+ for( TInt i=0; i<iObservers.Count(); i++ )
+ {
+ TInt retval( KErrNotFound );
+ retval = iObservers[i]->ErrorOccured( aError, aTransaction, aRegistration );
+ if( retval == KErrNone)
+ {
+ return;
+ }
+ }
+ }
+
+
+// -----------------------------------------------------------------------------
+// An asynchronous error has occured related to a request within an
+// existing dialog.
+// -----------------------------------------------------------------------------
+void CMusAvaSipConnectionObserver::ErrorOccured(
+ TInt aError,
+ CSIPTransactionBase& aSIPTransactionBase,
+ CSIPDialogAssocBase& aSIPDialogAssociation )
+ {
+ for( TInt i=0; i<iObservers.Count(); i++ )
+ {
+ TInt retval( KErrNotFound );
+ retval = iObservers[i]->ErrorOccured( aError,
+ aSIPTransactionBase,
+ aSIPDialogAssociation );
+ if( retval == KErrNone)
+ {
+ return;
+ }
+ }
+ }
+
+
+// -----------------------------------------------------------------------------
+// An asynchronous error has occured related to a refresh.
+// -----------------------------------------------------------------------------
+void CMusAvaSipConnectionObserver::ErrorOccured( TInt aError,
+ CSIPRefresh& aSIPRefresh )
+ {
+ for( TInt i=0; i<iObservers.Count(); i++ )
+ {
+ TInt retval( KErrNotFound );
+ retval = iObservers[i]->ErrorOccured( aError, aSIPRefresh );
+ if( retval == KErrNone)
+ {
+ return;
+ }
+ }
+ }
+
+
+// -----------------------------------------------------------------------------
+// An asynchronous error has occured related to a periodical refresh
+// that relates to a registration.
+// -----------------------------------------------------------------------------
+void CMusAvaSipConnectionObserver::ErrorOccured(
+ TInt aError,
+ CSIPRegistrationBinding& aRegistration )
+ {
+ for( TInt i=0; i<iObservers.Count(); i++ )
+ {
+ TInt retval( KErrNotFound );
+ retval = iObservers[i]->ErrorOccured( aError, aRegistration );
+ if( retval == KErrNone)
+ {
+ return;
+ }
+ }
+ }
+
+
+// -----------------------------------------------------------------------------
+// An asynchronous error has occured related to a periodical refresh
+// that belongs to SIP dialog association.
+// -----------------------------------------------------------------------------
+void CMusAvaSipConnectionObserver::ErrorOccured(
+ TInt aError,
+ CSIPDialogAssocBase& aSIPDialogAssociation )
+ {
+ for( TInt i=0; i<iObservers.Count(); i++ )
+ {
+ TInt retval( KErrNotFound );
+ retval = iObservers[i]->ErrorOccured( aError, aSIPDialogAssociation );
+ if( retval == KErrNone)
+ {
+ return;
+ }
+ }
+ }
+
+
+// -----------------------------------------------------------------------------
+// Invite was canceled with the CANCEL
+// -----------------------------------------------------------------------------
+void CMusAvaSipConnectionObserver::InviteCanceled(
+ CSIPServerTransaction& aTransaction )
+ {
+ for( TInt i=0; i<iObservers.Count(); i++ )
+ {
+ TInt retval( KErrNotFound );
+ retval = iObservers[i]->InviteCanceled( aTransaction );
+ if( retval == KErrNone)
+ {
+ return;
+ }
+ }
+ }
+
+
+// -----------------------------------------------------------------------------
+// Is called when the connection state changes
+// -----------------------------------------------------------------------------
+void CMusAvaSipConnectionObserver::ConnectionStateChanged (
+ CSIPConnection::TState aState )
+ {
+ for( TInt i=0; i<iObservers.Count(); i++ )
+ {
+ TInt retval( KErrNotFound );
+ retval = iObservers[i]->ConnectionStateChanged( aState );
+ if( retval == KErrNone)
+ {
+ return;
+ }
+ }
+ }
+
+// -----------------------------------------------------------------------------
+// C++ default constructor.
+// -----------------------------------------------------------------------------
+CMusAvaSipConnectionObserver::CMusAvaSipConnectionObserver()
+ {
+ }
+
+
+// -----------------------------------------------------------------------------
+// Symbian 2nd phase constructor.
+// -----------------------------------------------------------------------------
+void CMusAvaSipConnectionObserver::ConstructL()
+ {
+ iDefaultHandler = new( ELeave ) CMusAvaSipDefaultHandler();
+ iObservers.AppendL( iDefaultHandler );
+ }
+
+// -----------------------------------------------------------------------------
+//
+// -----------------------------------------------------------------------------
+void CMusAvaSipConnectionObserver::AddObserverL(
+ MMusAvaSipConnectionAdapter& aAdapter,
+ TInt aIndex )
+ {
+ TInt index = iObservers.Find( &aAdapter );
+
+ if( index == KErrNotFound )
+ {
+ TInt count = iObservers.Count();
+ if ( aIndex > KErrNotFound && aIndex < iObservers.Count() )
+ {
+ iObservers.InsertL( &aAdapter, aIndex );
+ }
+ else
+ {
+ iObservers.InsertL( &aAdapter, count-1 );
+ }
+ }
+ }
+
+// -----------------------------------------------------------------------------
+//
+// -----------------------------------------------------------------------------
+void CMusAvaSipConnectionObserver::RemoveObserver( MMusAvaSipConnectionAdapter& aAdapter )
+ {
+ TInt index = iObservers.Find( &aAdapter );
+
+ if( index != KErrNotFound )
+ {
+ iObservers.Remove( index );
+ }
+ }
+