voipplugins/sipimresolver/src/sipimresolver.cpp
branchRCL_3
changeset 22 d38647835c2e
parent 0 a4daefaec16c
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/voipplugins/sipimresolver/src/sipimresolver.cpp	Wed Sep 01 12:29:57 2010 +0100
@@ -0,0 +1,311 @@
+/*
+* Copyright (c) 2009 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:  implementation of sipimresolver
+*
+*/
+
+
+#include <spentry.h>
+#include <spproperty.h>
+#include <spsettings.h>
+#include <sdpmediafield.h>
+
+#include "sipimresolver.h"
+#include "csipclientresolverutils.h"
+#include "sipimresolverdebug.h"
+
+// media field descriptors
+_LIT8( KIMField1, "m=application 0 TCP SIPIM\r\n" );
+// For content-type header
+_LIT8( KIMContentType, "text/plain" );
+// For content-type header checks
+_LIT8( KIMMediaTypeApp, "text" );
+// SDP media subtype
+_LIT8( KIMMediaSubtypeSdp, "plain" );
+
+// ======== LOCAL FUNCTIONS ========
+
+// ---------------------------------------------------------------------------
+// CleanupSdpMediasArray
+// ---------------------------------------------------------------------------
+//
+void CleanupSdpMediasArray( TAny* aObj )
+    {
+    if ( aObj )
+        {
+        static_cast<RPointerArray<CSdpMediaField>*>( aObj )->
+            ResetAndDestroy();
+        }
+    }
+
+// ---------------------------------------------------------------------------
+// CleanupSipContentTypeHeaderArray
+// ---------------------------------------------------------------------------
+//
+void CleanupSipContentTypeHeaderArray( TAny* aObj )
+    {
+    if ( aObj )
+        {
+        static_cast<RPointerArray<CSIPContentTypeHeader>*>( aObj )->
+            ResetAndDestroy();
+        }
+    }
+
+
+// ======== MEMBER FUNCTIONS ========
+
+
+// ---------------------------------------------------------------------------
+// CSipImResolver::CSipImResolver
+// ---------------------------------------------------------------------------
+//
+CSipImResolver::CSipImResolver() 
+    {
+    }
+
+// ---------------------------------------------------------------------------
+// CSipImResolver::NewL
+// ---------------------------------------------------------------------------
+//
+CSipImResolver* CSipImResolver::NewL()
+	{
+	SIPIMRLOG( "[SIPIMRESOLVER] -> CSipImResolver::NewL()" )
+	CSipImResolver* self = new ( ELeave ) CSipImResolver;
+	return self;
+	}
+
+// ---------------------------------------------------------------------------
+// CSipImResolver::~CSipImResolver
+// ---------------------------------------------------------------------------
+//
+CSipImResolver::~CSipImResolver()
+	{
+    SIPIMRLOG( "[SIPIMRESOLVER] -> CSipImResolver::~CSipImResolver()" )
+	}
+
+// ---------------------------------------------------------------------------
+// From class CSIPResolvedClient2
+// CSipImResolver::MatchAcceptContactsL
+// ---------------------------------------------------------------------------
+//
+TBool CSipImResolver::MatchAcceptContactsL(
+    RStringF /*aMethod*/,
+    const CUri8& /*aRequestUri*/,
+    const RPointerArray<CSIPHeaderBase>& /*aHeaders*/,
+    const TDesC8& /*aContent*/,
+    const CSIPContentTypeHeader* /*aContentType*/,
+    TUid& /*aClientUid*/ )
+    {
+    return EFalse;
+    }
+
+// ---------------------------------------------------------------------------
+// From class CSIPResolvedClient2
+// CSipImResolver::MatchEventL
+// ---------------------------------------------------------------------------
+// 
+TBool CSipImResolver::MatchEventL(
+    RStringF /*aMethod*/,
+    const CUri8& /*aRequestUri*/,
+    const RPointerArray<CSIPHeaderBase>& /*aHeaders*/,
+    const TDesC8& /*aContent*/,
+    const CSIPContentTypeHeader* /*aContentType*/,
+    TUid& /*aClientUid*/)
+    {
+    return EFalse;
+    }
+
+// ---------------------------------------------------------------------------
+// From class CSIPResolvedClient2
+// CSIPImResolver::MatchRequestL
+// ---------------------------------------------------------------------------
+// 
+TBool CSipImResolver::MatchRequestL(
+    RStringF /*aMethod*/,
+    const CUri8& aRequestUri,
+    const RPointerArray<CSIPHeaderBase>& /*aHeaders*/,
+    const TDesC8& aContent,
+    const CSIPContentTypeHeader* aContentType,
+    TUid& aClientUid )
+    {
+    SIPIMRLOG( "[SIPIMRESOLVER] MatchRequetsL() IN" )
+    
+    aClientUid.iUid = 0;
+    RArray<TInt> callProviderIds;
+    CleanupClosePushL( callProviderIds );
+    
+    TBool match( EFalse );
+    TBool imrequest = ( aContent.Length() > 0 && aContentType &&
+        aContentType->MediaType().CompareF( KIMMediaTypeApp ) == 0 &&
+        aContentType->MediaSubtype().CompareF( KIMMediaSubtypeSdp ) == 0 );
+    
+    if( imrequest )
+        {
+        CSPSettings* spSettings = CSPSettings::NewLC();
+        CSPProperty* property = CSPProperty::NewLC();
+        
+        RArray<TUint> serviceIds;
+        CleanupClosePushL( serviceIds );
+        spSettings->FindServiceIdsL( serviceIds );
+        
+        for( TInt i( 0 ) ; i < serviceIds.Count() ; i++ )
+            {
+            TInt err = spSettings->FindPropertyL( 
+                serviceIds[ i ],
+                EPropertyCallProviderPluginId,
+                *property );
+            
+            if ( !err )
+                {
+                TInt callProviderId( 0 );
+                err = property->GetValue( callProviderId );
+                
+                if ( !err )
+                    {
+                    callProviderIds.AppendL( callProviderId );
+                    }
+                }
+            }
+        
+        CleanupStack::PopAndDestroy( &serviceIds );
+        CleanupStack::PopAndDestroy( property );
+        CleanupStack::PopAndDestroy( spSettings ); 
+        
+        CSipClientResolverUtils* resolver = CSipClientResolverUtils::NewLC();
+                
+        RArray<TUid> uids;
+        CleanupClosePushL( uids );
+        
+        TRAPD( err, resolver->GetAllImplementationUidsWithUserL(
+            aRequestUri.Uri().Extract( EUriUserinfo ), uids ) );
+        if ( KErrNotFound != err && KErrNone != err )
+            {
+            User::Leave( err );
+            }
+        TInt imProviderId( KErrNotFound );
+        for ( TInt j( 0 ) ; j < uids.Count() ; j++ )
+            {
+            TInt ret = callProviderIds.Find( uids[ j ].iUid );
+            
+            if ( KErrNotFound == ret )
+                {
+                imProviderId = uids[ j ].iUid;
+                break;
+                }         
+            }
+        
+        CleanupStack::PopAndDestroy( &uids );
+        CleanupStack::PopAndDestroy( resolver );
+        
+        if ( !err && ( KErrNotFound != imProviderId ) )
+            {
+            aClientUid.iUid = imProviderId;
+            match = ETrue;
+            }
+        }
+    
+    CleanupStack::PopAndDestroy( &callProviderIds );
+    
+    SIPIMRLOGP( "[SIPIMRESOLVER] MatchRequetsL() match = %d", match  )
+    SIPIMRLOGP( "[SIPIMRESOLVER] MatchRequetsL() client uid = %d", aClientUid.iUid  )
+  
+    return match; 
+    }
+
+// ---------------------------------------------------------------------------
+// From class CSIPResolvedClient2
+// CSIPImResolver::ConnectSupported
+// ---------------------------------------------------------------------------
+// 
+TBool CSipImResolver::ConnectSupported()
+    {
+    return EFalse;
+    }
+
+// ---------------------------------------------------------------------------
+// From class CSIPResolvedClient2
+// CSIPImResolver::ConnectL
+// ---------------------------------------------------------------------------
+//
+void CSipImResolver::ConnectL( const TUid& /*aClientUid*/ )
+    {
+    // do nothing
+    }
+
+// ---------------------------------------------------------------------------
+// From class CSIPResolvedClient2
+// CSIPImResolver::CancelConnect
+// ---------------------------------------------------------------------------
+// 
+void CSipImResolver::CancelConnect( const TUid& /*aClientUid*/ )
+    {
+    // do nothing
+    }
+
+// ---------------------------------------------------------------------------
+// From class CSIPResolvedClient2
+// CSIPImResolver::SupportedContentTypesL
+// ---------------------------------------------------------------------------
+// 
+RPointerArray<CSIPContentTypeHeader> CSipImResolver::SupportedContentTypesL()
+    {
+    SIPIMRLOG( "[SIPIMRESOLVER] -> CSipImResolver::SupportedContentTypesL()" )
+
+    RPointerArray<CSIPContentTypeHeader> ret;   
+    TCleanupItem tci( CleanupSipContentTypeHeaderArray, &ret );
+    
+    CleanupStack::PushL( tci );
+    CSIPContentTypeHeader* ctype = CSIPContentTypeHeader::DecodeL(
+        KIMContentType );
+    ret.AppendL( ctype );
+    CleanupStack::Pop( ); // TCleanupItem
+
+    SIPIMRLOG( "[SIPIMRESOLVER] <- CSipImResolver::SupportedContentTypesL()" )
+    return ret;
+    }
+
+// ---------------------------------------------------------------------------
+// From class CSIPResolvedClient2
+// CSIPImResolver::SupportedSdpMediasL
+// ---------------------------------------------------------------------------
+// 
+RPointerArray<CSdpMediaField> CSipImResolver::SupportedSdpMediasL()
+    {
+    SIPIMRLOG( "[SIPIMRESOLVER] -> CSipImResolver::SupportedSdpMediasL()" )
+    
+    // Initialise return array
+    RPointerArray<CSdpMediaField> ret;
+    TCleanupItem tci( CleanupSdpMediasArray, &ret );
+    CleanupStack::PushL( tci );  
+    
+    CSdpMediaField* field = CSdpMediaField::DecodeLC( KIMField1 );
+    ret.AppendL( field );
+    CleanupStack::Pop( field );    
+    
+    CleanupStack::Pop( ); // TCleanupItem
+
+    SIPIMRLOG( "[SIPIMRESOLVER] <- CSipImResolver::SupportedSdpMediasL()" )
+    return ret;
+    }
+
+// ---------------------------------------------------------------------------
+// From class CSIPResolvedClient2
+// CSIPImResolver::AddClientSpecificHeadersForOptionsResponseL
+// ---------------------------------------------------------------------------
+// 
+void CSipImResolver::AddClientSpecificHeadersForOptionsResponseL(
+    RPointerArray<CSIPHeaderBase>& /*aHeaders*/ )
+    {
+    // do nothing
+    }