diff -r 000000000000 -r f0cf47e981f9 mmsharing/mmshavailability/src/musavaclientresolverutil.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mmsharing/mmshavailability/src/musavaclientresolverutil.cpp Thu Dec 17 08:44:37 2009 +0200 @@ -0,0 +1,410 @@ +/* +* Copyright (c) 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: Utility class to handle SIP client resolver cenrep table. +* +*/ + + + + +#include "musavaclientresolverutil.h" +#include "musuid.hrh" +#include "muslogger.h" +#include +#include + +// SipMXResolverImplUid +const TUid KSipMXResolverImplUid = { 0x10283140 }; + + +// + +// The following constant is defined in sipprofile.h in Sawfish. +// Since the constant is not defined in all releases, it must be copied here. + +/** +* A unique Contact-header's user-part +* generated automatically by the SIP implementation. +* The value is of type TDesC8. +* This parameter is read-only and +* trying to set it will fail with KErrAccessDenied. +*/ +const TUint32 KCopyOfKSIPContactHeaderUser = 15; + +// The following Uids and keys are defined in file +// sipclientresolverconfigcrkeys.h in Sawfish. Since the header is not present +// in all releases, the values must be defined here. + +/// Defines configuration parameters used by SIP Client Resolver +const TUid KCRUidSIPClientResolverConfig = { 0x10282EE7 }; + +/// Mask for the less significant bits in setting keys. +/// These bits are reserved for field type information. +const TUint32 KSIPClientResolverFieldTypeMask = 0xf0000000; + +/// Mask for the most significant bits in setting keys. +/// These bits are reserved for the actual key part. +const TUint32 KSIPClientResolverKeyMask = 0x0fffffff; + +/** +* Mask for username field. +* Field type is TDesC8. +*/ +const TUint32 KSIPClientResolverUserNameMask = 0x10000000; + +/** +* Mask for plug-in implementation UID field. +* Field type is TInt32. +*/ +const TUint32 KSIPClientResolverPluginUIDMask = 0x20000000; + +/** +* Mask for client UID field. +* Field type is TInt32. +*/ +const TUint32 KSIPClientResolverClientUIDMask = 0x30000000; + +// + + +// ======== MEMBER FUNCTIONS ======== + +// ----------------------------------------------------------------------------- +// +// ----------------------------------------------------------------------------- +// +CMusAvaClientResolverUtil::CMusAvaClientResolverUtil() + { + } + + +// ----------------------------------------------------------------------------- +// +// ----------------------------------------------------------------------------- +// +void CMusAvaClientResolverUtil::ConstructL() + { + iRepository = CRepository::NewL( KCRUidSIPClientResolverConfig ); + } + + +// ----------------------------------------------------------------------------- +// +// ----------------------------------------------------------------------------- +// +CMusAvaClientResolverUtil* CMusAvaClientResolverUtil::NewL() + { + MUS_LOG( "mus: [MUSAVA] -> CMusAvaClientResolverUtil::NewL()" ) + CMusAvaClientResolverUtil* self = CMusAvaClientResolverUtil::NewLC(); + CleanupStack::Pop( self ); + MUS_LOG( "mus: [MUSAVA] <- CMusAvaClientResolverUtil::NewL()" ) + return self; + } + + +// ----------------------------------------------------------------------------- +// +// ----------------------------------------------------------------------------- +// +CMusAvaClientResolverUtil* CMusAvaClientResolverUtil::NewLC() + { + MUS_LOG( "mus: [MUSAVA] -> CMusAvaClientResolverUtil::NewLC()" ) + CMusAvaClientResolverUtil* self = new( ELeave ) CMusAvaClientResolverUtil; + CleanupStack::PushL( self ); + self->ConstructL(); + MUS_LOG( "mus: [MUSAVA] <- CMusAvaClientResolverUtil::NewLC()" ) + return self; + } + + +// ----------------------------------------------------------------------------- +// +// ----------------------------------------------------------------------------- +// +CMusAvaClientResolverUtil::~CMusAvaClientResolverUtil() + { + MUS_LOG( "mus: [MUSAVA] -> ~CMusAvaClientResolverUtil()" ) + delete iRepository; + MUS_LOG( "mus: [MUSAVA] <- ~CMusAvaClientResolverUtil()" ) + } + + +// ----------------------------------------------------------------------------- +// +// ----------------------------------------------------------------------------- +// +void CMusAvaClientResolverUtil::RegisterClientWithUserL( + CSIPProfile& aProfile ) const + { + MUS_LOG( "mus: [MUSAVA] -> CMusAvaClientResolverUtil::RegisterClientWithUserL( profile )" ) + RBuf8 contactHeaderUser; + contactHeaderUser.CleanupClosePushL(); + User::LeaveIfError( GetContactHeaderUser( aProfile, contactHeaderUser ) ); + + RegisterClientWithUserL( TUid::Uid( KMusUiUid ), + contactHeaderUser, + KSipMXResolverImplUid ); + + CleanupStack::PopAndDestroy( &contactHeaderUser ); + MUS_LOG( "mus: [MUSAVA] <- CMusAvaClientResolverUtil::RegisterClientWithUserL( profile )" ) + } + + +// ----------------------------------------------------------------------------- +// Add line to client resolver cenrep table +// ----------------------------------------------------------------------------- +// +void CMusAvaClientResolverUtil::RegisterClientWithUserL( + const TUid& aImplementation, + const TDesC8& aProfileContactHeaderUser, + const TUid& aResolver ) const + { + MUS_LOG( "mus: [MUSAVA] -> CMusAvaClientResolverUtil::RegisterClientWithUserL()" ) + + if( aImplementation.iUid <= 0 || + aProfileContactHeaderUser.Length() <= 0 || + aResolver.iUid <= 0 ) + { + User::Leave( KErrArgument ); + } + + // Remove all earlier instances of client&user combination + UnRegisterClientWithUserL( aImplementation, aProfileContactHeaderUser ); + + User::LeaveIfError( + iRepository->StartTransaction( CRepository::EConcurrentReadWriteTransaction ) ); + TUint32 newKey = 0; + CreateNewKeyL( newKey ); + // Add the new row + TInt uid = aImplementation.iUid; + User::LeaveIfError( + iRepository->Create(newKey|KSIPClientResolverClientUIDMask, uid ) ); + User::LeaveIfError( + iRepository->Create(newKey|KSIPClientResolverUserNameMask, aProfileContactHeaderUser ) ); + uid = aResolver.iUid; + User::LeaveIfError( + iRepository->Create(newKey|KSIPClientResolverPluginUIDMask, uid ) ); + + // Commit the transaction + User::LeaveIfError( iRepository->CommitTransaction( newKey ) ); + + MUS_LOG( "mus: [MUSAVA] <- CMusAvaClientResolverUtil::RegisterClientWithUserL()" ) + } + + +// ----------------------------------------------------------------------------- +// Remove line from client resolver cenrep table +// ----------------------------------------------------------------------------- +// +void CMusAvaClientResolverUtil::UnRegisterClientWithUserL( + CSIPProfile& aProfile ) const + { + MUS_LOG( "mus: [MUSAVA] -> CMusAvaClientResolverUtil::UnRegisterClientWithUserL( profile )" ) + + RBuf8 contactHeaderUser; + contactHeaderUser.CleanupClosePushL(); + User::LeaveIfError( GetContactHeaderUser( aProfile, contactHeaderUser ) ); + + UnRegisterClientWithUserL( TUid::Uid( KMusUiUid ), contactHeaderUser ); + + CleanupStack::PopAndDestroy( &contactHeaderUser ); + + MUS_LOG( "mus: [MUSAVA] <- CMusAvaClientResolverUtil::UnRegisterClientWithUserL( profile )" ) + } + + +// ----------------------------------------------------------------------------- +// Remove line from client resolver cenrep table +// ----------------------------------------------------------------------------- +// +void CMusAvaClientResolverUtil::UnRegisterClientWithUserL( + const TUid& aImplementation, + const TDesC8& aProfileContactHeaderUser ) const + { + MUS_LOG( "mus: [MUSAVA] -> CMusAvaClientResolverUtil::UnRegisterClientWithUserL()" ) + + if( aImplementation.iUid <= 0 || + aProfileContactHeaderUser.Length() <= 0 ) + { + User::Leave( KErrArgument ); + } + + RArray keys; + CleanupClosePushL( keys ); + GetClientWithUserL( aImplementation, aProfileContactHeaderUser, keys ); + for ( TInt i = 0; i < keys.Count(); i++ ) + { + TUint32 errorKey; + User::LeaveIfError( + iRepository->StartTransaction( + CRepository::EConcurrentReadWriteTransaction ) ); + iRepository->Delete( keys[i], KSIPClientResolverKeyMask, errorKey ); + // Commit the transaction + User::LeaveIfError( iRepository->CommitTransaction( errorKey ) ); + } + CleanupStack::PopAndDestroy( &keys ); + + MUS_LOG( "mus: [MUSAVA] <- CMusAvaClientResolverUtil::UnRegisterClientWithUserL()" ) + } + + +// ----------------------------------------------------------------------------- +// Resolve correct implementation UID for contact header +// ----------------------------------------------------------------------------- +// +void CMusAvaClientResolverUtil::GetImplementationUidWithUserL( + const TDesC8& aProfileContactHeaderUser, + TUid& aImplementation ) const + { + MUS_LOG( "mus: [MUSAVA] -> CMusAvaClientResolverUtil::GetImplementationUidWithUserL()" ) + + RArray keys; + CleanupClosePushL( keys ); + // Find all rows where KSIPClientResolverUserNameMask is aProfileContactHeaderUser + iRepository->FindEqL( KSIPClientResolverUserNameMask, + KSIPClientResolverFieldTypeMask, + aProfileContactHeaderUser, + keys ); + if (keys.Count() > 1) + { + //resolve correct Key + } + else if(keys.Count() == 1) + { + TInt implementationValue = KErrNotFound; + // Get implmentation uid of found user name + iRepository->Get( ( keys[0]^KSIPClientResolverUserNameMask ) | + KSIPClientResolverClientUIDMask, implementationValue ); + + User::LeaveIfError(implementationValue); + aImplementation.iUid = implementationValue; + } + else + { + User::Leave(KErrNotFound); + } + + CleanupStack::PopAndDestroy( &keys ); + + MUS_LOG( "mus: [MUSAVA] <- CMusAvaClientResolverUtil::GetImplementationUidWithUserL()" ) + } + + +// ----------------------------------------------------------------------------- +// Find clients from resolver cenrep table +// ----------------------------------------------------------------------------- +// +void CMusAvaClientResolverUtil::GetClientWithUserL( + const TUid& aImplementation, + const TDesC8& aProfileContactHeaderUser, + RArray& aFoundKeys ) const + { + MUS_LOG( "mus: [MUSAVA] -> CMusAvaClientResolverUtil::GetClientWithUserL()" ) + + RArray keys; + + CleanupClosePushL( keys ); + // Find all rows where KSIPClientResolverUserNameMask is aProfileUserName + iRepository->FindEqL( KSIPClientResolverUserNameMask, + KSIPClientResolverFieldTypeMask, + aProfileContactHeaderUser, keys ); + for ( TInt i = 0; i < keys.Count(); i++ ) + { + TInt implementationValue = KErrNotFound; + // Get implmentation uid of found user name + iRepository->Get( ( keys[i]^KSIPClientResolverUserNameMask ) | + KSIPClientResolverClientUIDMask, implementationValue ); + // If implementation uid matches given uid, add row to found keys + if ( implementationValue == aImplementation.iUid ) + { + aFoundKeys.Append( keys[i]^KSIPClientResolverUserNameMask ); + } + + } + CleanupStack::PopAndDestroy( &keys ); + + MUS_LOG( "mus: [MUSAVA] <- CMusAvaClientResolverUtil::GetClientWithUserL()" ) + } + + +// ----------------------------------------------------------------------------- +// Create a new key for the new row +// ----------------------------------------------------------------------------- +// +void CMusAvaClientResolverUtil::CreateNewKeyL( + TUint32& aNewKey ) const + { + MUS_LOG( "mus: [MUSAVA] -> CMusAvaClientResolverUtil::CreateNewKeyL()" ) + + RArray keys; + CleanupClosePushL( keys ); + TInt err = KErrNone; + + TRAPD( leaveCode, err = iRepository->FindL( KSIPClientResolverUserNameMask, + KSIPClientResolverFieldTypeMask, + keys ) ); + if ( KErrNotFound == leaveCode ) + { + err = KErrNotFound; + leaveCode = KErrNone; + } + User::LeaveIfError( leaveCode ); + if ( ( KErrNotFound == err ) || ( keys.Count() == 0 ) ) + { + aNewKey = 1; + } + else + { + User::LeaveIfError( err ); + // Find the biggest key and increment it by one + keys.SortUnsigned(); + aNewKey = KSIPClientResolverUserNameMask^keys[ keys.Count() - 1 ] + 1; + } + CleanupStack::PopAndDestroy( &keys ); + + MUS_LOG( "mus: [MUSAVA] <- CMusAvaClientResolverUtil::CreateNewKeyL()" ) + } + + +// ----------------------------------------------------------------------------- +// +// ----------------------------------------------------------------------------- +// +TInt CMusAvaClientResolverUtil::GetContactHeaderUser( + CSIPProfile& aProfile, + RBuf8& aContactHeaderUser ) const + { + MUS_LOG( "mus: [MUSAVA] -> CMusAvaClientResolverUtil::GetContactHeaderUser()" ) + + TInt result( KErrNotFound ); + const TDesC8* contactHeaderUser( NULL ); + + // Get SIP's Username + result = aProfile.GetParameter( KCopyOfKSIPContactHeaderUser, contactHeaderUser ); + + if ( result == KErrNone && contactHeaderUser ) + { + result = aContactHeaderUser.ReAlloc( contactHeaderUser->Length() ); + if ( KErrNone == result ) + { + aContactHeaderUser.Copy( *contactHeaderUser ); + } + } + + MUS_LOG( "mus: [MUSAVA] <- CMusAvaClientResolverUtil::GetContactHeaderUser()" ) + + return result; + } + +