mmsharing/mmshavailability/src/musavaclientresolverutil.cpp
changeset 0 f0cf47e981f9
--- /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 <centralrepository.h>
+#include <sipprofile.h>
+
+// SipMXResolverImplUid
+const TUid KSipMXResolverImplUid = { 0x10283140 };
+
+
+// <copied values>
+
+// 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;
+
+// </copied values>
+
+
+// ======== 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<TUint32> 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<TUint32> 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<TUint32>& aFoundKeys ) const
+    {
+    MUS_LOG( "mus: [MUSAVA]  -> CMusAvaClientResolverUtil::GetClientWithUserL()" )
+
+    RArray<TUint32> 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<TUint32> 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;                
+    }
+
+