diff -r f742655b05bf -r d38647835c2e voipplugins/sipimresolver/src/sipimresolver.cpp --- /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 +#include +#include +#include + +#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*>( aObj )-> + ResetAndDestroy(); + } + } + +// --------------------------------------------------------------------------- +// CleanupSipContentTypeHeaderArray +// --------------------------------------------------------------------------- +// +void CleanupSipContentTypeHeaderArray( TAny* aObj ) + { + if ( aObj ) + { + static_cast*>( 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& /*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& /*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& /*aHeaders*/, + const TDesC8& aContent, + const CSIPContentTypeHeader* aContentType, + TUid& aClientUid ) + { + SIPIMRLOG( "[SIPIMRESOLVER] MatchRequetsL() IN" ) + + aClientUid.iUid = 0; + RArray 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 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 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 CSipImResolver::SupportedContentTypesL() + { + SIPIMRLOG( "[SIPIMRESOLVER] -> CSipImResolver::SupportedContentTypesL()" ) + + RPointerArray 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 CSipImResolver::SupportedSdpMediasL() + { + SIPIMRLOG( "[SIPIMRESOLVER] -> CSipImResolver::SupportedSdpMediasL()" ) + + // Initialise return array + RPointerArray 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& /*aHeaders*/ ) + { + // do nothing + }