simpleengine/siputils/src/simplesipprofileobserver.cpp
changeset 0 c8caa15ef882
child 12 e6a66db4e9d0
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/simpleengine/siputils/src/simplesipprofileobserver.cpp	Tue Feb 02 01:05:17 2010 +0200
@@ -0,0 +1,310 @@
+/*
+* 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:    sip connection
+*
+*/
+
+
+
+
+// INCLUDE FILES
+#include <sip.h>
+#include <sipconnection.h>
+#include <sipconnectionobserver.h>
+#include <sipresponseelements.h>
+#include <sipclienttransaction.h>
+#include <sipprofile.h>
+#include <sipprofileregistry.h>
+#include "simplesipprofileobserver.h"
+
+#ifdef _DEBUG
+#include "simpledebugutils.h"
+#endif
+
+
+// ================= MEMBER FUNCTIONS =======================
+//
+
+// ----------------------------------------------------------
+// CSimpleSipProfileObserver::CSimpleSipProfileObserver
+// ----------------------------------------------------------
+//
+CSimpleSipProfileObserver::CSimpleSipProfileObserver( CSimpleSipConnectionObserver& aObs )
+: iObs(aObs)
+    {
+    }
+
+// ----------------------------------------------------------
+// CSimpleSipProfileObserver::~CSimpleSipProfileObserver
+// ----------------------------------------------------------
+//
+CSimpleSipProfileObserver::~CSimpleSipProfileObserver()
+    {
+#ifdef _DEBUG
+    TSimpleLogger::Log(_L("SipProfileObserver: DESTRUCTOR start" ));
+#endif
+    if ( iProfile && iRegistry )
+        {
+        iRegistry->Disable( *iProfile );
+        }
+    delete iProfile;
+    delete iRegistry;
+#ifdef _DEBUG
+    TSimpleLogger::Log(_L("SipProfileObserver: DESTRUCTOR end" ));
+#endif
+    }
+
+// ----------------------------------------------------------
+// CSimpleSipProfileObserver::NewL
+// ----------------------------------------------------------
+//
+CSimpleSipProfileObserver* CSimpleSipProfileObserver::NewL(
+    CSIP* aSIP,
+    CSimpleSipConnectionObserver& aObs )
+    {
+#ifdef _DEBUG
+    TSimpleLogger::Log(_L("SipProfileObserver: NewL" ));
+#endif
+    CSimpleSipProfileObserver* self = new (ELeave) CSimpleSipProfileObserver( aObs );
+    CleanupStack::PushL( self );
+    self->ConstructL( aSIP );
+    CleanupStack::Pop( self );
+    return self;
+    }
+
+// ----------------------------------------------------------
+// CSimpleSipProfileObserver::ConstructL
+// ----------------------------------------------------------
+//
+void CSimpleSipProfileObserver::ConstructL( CSIP* aSIP )
+    {
+    iRegistry = CSIPProfileRegistry::NewL( *aSIP, *this );
+    }
+
+// ----------------------------------------------------------
+// CSimpleSipProfileObserver::RegisterDefaultProfileL
+// ----------------------------------------------------------
+//
+void CSimpleSipProfileObserver::RegisterDefaultProfileL( )
+    {
+#ifdef _DEBUG
+    TSimpleLogger::Log(_L("SipProfileObserver: RegisterDefaultProfileL" ));
+#endif
+    if ( iProfile )
+        {
+        User::Leave( KErrAlreadyExists );
+        }
+
+    // Get the default profile.
+    iProfile = iRegistry->DefaultProfileL();
+
+    // Safety check that DefaultProfileL() didn't return NULL pointer.
+    if ( !iProfile )
+        {
+        User::Leave( KErrNotFound );
+        }
+    if ( !iRegistry->IsEnabled( *iProfile ))
+        {
+        // Ask Profile API to enable the retrieved profile for our use.
+        iRegistry->EnableL( *iProfile, iObs );
+        }
+    }
+
+// ----------------------------------------------------------
+// CSimpleSipProfileObserver::RegisterGivenProfileL
+// ----------------------------------------------------------
+//
+void CSimpleSipProfileObserver::RegisterGivenProfileL( TUint32 aID )
+    {
+#ifdef _DEBUG
+    TSimpleLogger::Log(_L("SipProfileObserver: RegisterGivenProfileL id=%d" ), aID);
+#endif
+
+    RPointerArray<CSIPProfile> profiles;
+
+    if ( iProfile )
+        {
+        User::Leave( KErrAlreadyExists );
+        }
+
+    // Search the profiles until the proper one is found.
+    iRegistry->ProfilesL( profiles );
+
+    TInt count = profiles.Count();
+    TUint32 val = 0;
+    CSIPProfile* sippro = NULL;
+    for ( TInt i = 0; i < count; i++ )
+        {
+        sippro = profiles[i];
+        TInt err = sippro->GetParameter( KSIPProfileId, val );
+#ifdef _DEBUG
+        TSimpleLogger::Log(_L("SipProfileObserver: Profile id=%d" ), val);
+#endif
+        if ( !err && val == aID)
+            {
+            // The profile matches for the given search criteria
+            iProfile = sippro;
+            }
+        else
+            {
+            // delete unnecessary profile entity,
+            // the ownership was transferred to us.
+            delete sippro;
+            }
+        }
+
+    // reset array, unnecessary profiles are already deleted
+    profiles.Reset();
+
+    // Safety check that DefaultProfileL() didn't return NULL pointer.
+    if ( !iProfile )
+        {
+        User::Leave( KErrNotFound );
+        }
+    if ( !iRegistry->IsEnabled( *iProfile ))
+        {
+        // Ask Profile API to enable the retrieved profile for our use.
+        iRegistry->EnableL( *iProfile, iObs );
+        }
+
+    }
+
+// ----------------------------------------------------------
+// CSimpleSipProfileObserver::GiveConnectionL
+// ----------------------------------------------------------
+//
+CSIPConnection* CSimpleSipProfileObserver::GiveConnectionL()
+    {
+#ifdef _DEBUG
+    TSimpleLogger::Log(_L("SipProfileObserver: GiveConnectionL" ));
+#endif
+    // Check if the SIP connection is already enabled or should we
+    // wait it for.
+    TBool val( EFalse );
+    TInt err = iProfile->GetParameter( KSIPProfileRegistered, val );
+    User::LeaveIfError( err ); 
+    // The pameter val indicates if the profile can be immediately used
+    if ( val )
+        {
+        // get the SIP connection used by the profile
+        return iRegistry->ConnectionL( *iProfile );
+        }
+    else
+        {
+        User::Leave( KErrNotReady );
+        }
+    return (CSIPConnection*) NULL;
+    }
+    
+// ----------------------------------------------------------
+// CSimpleSipProfileObserver::IsProfileActive
+// ----------------------------------------------------------
+//
+TBool CSimpleSipProfileObserver::IsProfileActive()
+    {
+    // Check if the SIP profile is active
+    // wait it for.
+    TBool val( EFalse );
+    // Profile is created in ConstructL, so it exists.
+    if ( iProfile )
+        {                
+        iProfile->GetParameter( KSIPProfileRegistered, val );
+        }
+    return val;
+    }    
+
+// ----------------------------------------------------------
+// CSimpleSipProfileObserver::GiveUserAorL
+// ----------------------------------------------------------
+//
+TPtrC8 CSimpleSipProfileObserver::GiveUserAorL()
+    {
+#ifdef _DEBUG
+    TSimpleLogger::Log(_L("SipProfileObserver: GiveUserAorL" ));
+#endif   
+    // Check first if registered
+    TBool val( EFalse );
+    TInt err = iProfile->GetParameter( KSIPProfileRegistered, val );
+    User::LeaveIfError( err );    
+    if ( !val)
+        {
+        User::Leave( KErrNotReady );
+        }
+    // Get the first element in the array         
+    const MDesC8Array* aors = 0;
+    err=  iProfile->GetParameter( KSIPRegisteredAors, aors );    
+    User::LeaveIfError(err);    
+    if ( !aors || aors->MdcaCount() == 0 )
+        {
+        User::Leave( KErrNotReady );
+        }
+    return aors->MdcaPoint(0);
+    }
+
+// ----------------------------------------------------------
+// CSimpleSipProfileObserver::ProfileRegistryEventOccurred
+// ----------------------------------------------------------
+//
+void CSimpleSipProfileObserver::ProfileRegistryEventOccurred(
+    TUint32 /*aProfileId*/, TEvent aEvent)
+    {
+#ifdef _DEBUG
+    TSimpleLogger::Log(_L("SipProfileObserver: ProfileRegistryEventOccurred event=%d" ), aEvent );
+#endif
+    if ( aEvent == EProfileRegistered )
+        {
+        iObs.ProfileStateChanged( CSIPConnection::EActive, KErrNone );
+        }
+    else if ( aEvent == EProfileDeregistered )
+        {
+        iObs.ProfileStateChanged( CSIPConnection::EInactive, KErrNone );
+        }     
+    else if ( aEvent == EProfileUpdated )
+        {
+#ifdef _DEBUG
+        TSimpleLogger::Log(_L("SipProfileObserver: EProfileUpdated - ProfileEnabled : %d" ), iRegistry->IsEnabled( *iProfile ) );
+        TSimpleLogger::Log(_L("SipProfileObserver: EProfileUpdated - Profile reg er : %d" ), iRegistry->LastRegistrationError( *iProfile ) );
+        TSimpleLogger::Log(_L("SipProfileObserver: EProfileUpdated - IsContextActive : %d" ), iProfile->IsContextActive() );
+#endif
+
+        // Notify observer to refresh SIP connection.
+        iObs.ProfileUpdated();
+        }           
+    else if ( aEvent == EProfileDestroyed )
+        {      
+        iObs.ProfileStateChanged( CSIPConnection::EUnavailable, KErrNone );
+        }
+  }
+
+// ----------------------------------------------------------
+// CSimpleSipProfileObserver::ProfileRegistryErrorOccurred
+// ----------------------------------------------------------
+//
+void CSimpleSipProfileObserver::ProfileRegistryErrorOccurred(
+    TUint32 /*aProfileId*/, TInt aError)
+    {
+#ifdef _DEBUG
+    TSimpleLogger::Log(_L("SipProfileObserver: ProfileRegistryErrorOccurred" ));
+#endif
+    iObs.ProfileStateChanged( CSIPConnection::EUnavailable, aError );
+    }
+
+// ----------------------------------------------------------
+// CSimpleSipProfileObserver::ProfileContext
+// ----------------------------------------------------------
+//
+MSIPRegistrationContext* CSimpleSipProfileObserver::ProfileContext()
+    {
+    return iProfile;
+    }