emailservices/emailstore/message_store/client/src/MsgStore.cpp
changeset 0 8466d47a6819
child 8 e1b6206813b4
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/emailservices/emailstore/message_store/client/src/MsgStore.cpp	Thu Dec 17 08:39:21 2009 +0200
@@ -0,0 +1,434 @@
+/*
+* 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:  Message store client implementation.
+*
+*/
+
+
+
+//<cmail>
+#include "MsgStore.h"
+#include "MsgStoreMailBox.h"
+#include "MsgStoreAccount.h"
+#include "MsgStoreObserver.h"
+#include "MsgStorePropertyContainer.h"
+#include "MsgStorePropertyKeys.h"
+//</cmail>
+
+#include "MsgStoreSessionContext.h"
+#include "MsgStoreObserverHandler.h"
+//<cmail>
+//#include "IsMsgStorePropertyKeys.h"
+//</cmail>
+
+/** Creates an empty instance of this class on the heap. 
+    \param aRetryIndefinitely if true, the client tries to connect to the message store server indefinitely,
+           otherwise, it leaves if failed to connect to server for 20 times with 1 second interval between 
+           each retry
+ */	
+EXPORT_C CMsgStore* CMsgStore::NewL( TBool aRetryIndefinitely )
+{
+    CMsgStore* self = new( ELeave ) CMsgStore();
+    CleanupStack::PushL( self );
+    self->ConstructL( ETrue, aRetryIndefinitely );
+    CleanupStack::Pop( self );
+    return self;
+}
+
+// ==========================================================================
+// FUNCTION: ConstructL
+// ==========================================================================
+void CMsgStore::ConstructL( TBool aLaunchServerIfNeeded, TBool aRetryIndefinitely  )
+{
+	iContext = new(ELeave) CMsgStoreSessionContext;
+	
+	iContext->iObserverHandler = NULL; 
+	
+	User::LeaveIfError( iContext->iSession.Connect( aLaunchServerIfNeeded, aRetryIndefinitely ) );
+}
+
+// ==========================================================================
+// FUNCTION: AuthenticatedL
+// ==========================================================================
+EXPORT_C TBool CMsgStore::AuthenticatedL()
+{
+	return iContext->iSession.AuthenticatedL();
+} // end AuthenticatedL
+
+// ==========================================================================
+// FUNCTION: AuthenticateL
+// ==========================================================================
+EXPORT_C TBool CMsgStore::AuthenticateL( const TDesC& aPassword )
+	{
+	return iContext->iSession.AuthenticateL( aPassword );	
+	} // end AuthenticateL
+
+// ==========================================================================
+// FUNCTION: ClearAuthenticationL
+// ==========================================================================
+EXPORT_C void CMsgStore::ClearAuthenticationL()
+	{	
+	iContext->iSession.ClearAuthenticationL();
+	} // end ClearAuthenticationL
+
+// ==========================================================================
+// FUNCTION: HasPasswordL
+// ==========================================================================
+EXPORT_C TBool CMsgStore::HasPasswordL()
+	{
+	return iContext->iSession.HasPasswordL();
+	} // end HasPasswordL
+
+// ==========================================================================
+// FUNCTION: HasPasswordL
+// ==========================================================================
+//EXPORT_C TBool CMsgStore::HasPasswordL( const CMsgStoreAccount& aAccount )
+//    {
+    //, add account parameter
+//    return iContext->iSession.HasPasswordL();
+//    } // end HasPasswordL
+
+// ==========================================================================
+// FUNCTION: SetPasswordL
+// ==========================================================================
+EXPORT_C void CMsgStore::SetPasswordL( /* const CMsgStoreAccount& aAccount, */ const TDesC& aPassword )
+	{	
+    //, add account parameter
+	iContext->iSession.SetPasswordL( aPassword );
+	} // end SetPasswordL
+
+// ==========================================================================
+// FUNCTION: ChangePasswordL
+// ==========================================================================
+EXPORT_C TBool CMsgStore::ChangePasswordL( /*const CMsgStoreAccount& aAccount, */ const TDesC& aOldPassword, const TDesC& aNewPassword  )
+	{	
+    //, add account parameter
+    return iContext->iSession.ChangePasswordL( aOldPassword, aNewPassword );
+	} // end ChangePasswordL
+
+/** Opens an existing account. 
+
+    \param aAccount, the info about the account to be used.
+    \retval an instance of CMsgStoreMailBox.  
+    \note the caller ownes the return object.
+*/	
+EXPORT_C CMsgStoreMailBox* CMsgStore::OpenAccountL( const CMsgStoreAccount& aAccount )
+	{
+	RBuf8 propertiesBuf;
+	CleanupClosePushL( propertiesBuf );
+	
+	TMsgStoreId mbId = iContext->iSession.OpenAccountL( aAccount, propertiesBuf );
+	
+	CMsgStoreMailBox *mailBox = CMsgStoreMailBox::NewL( *iContext, mbId, propertiesBuf );
+	
+	CleanupStack::PopAndDestroy( &propertiesBuf );
+	
+	return mailBox;
+	}
+
+
+/** Opens an existing account by its MailBoxId. 
+ * 
+ *   \param aMailBoxId, the id of the mailbox.
+ *   \retval an instance of CMsgStoreMailBox.  
+ *   \note the caller ownes the return object.
+*/  
+EXPORT_C CMsgStoreMailBox* CMsgStore::OpenAccountL( TMsgStoreId aMailBoxId )
+    {
+    RBuf8 propertiesBuf;
+    CleanupClosePushL( propertiesBuf );
+    
+    TMsgStoreId parentId = KMsgStoreRootMailBoxId;
+    
+    iContext->iSession.ContainerPropertiesL( aMailBoxId, parentId, KMsgStoreInvalidId, propertiesBuf );
+    
+    CMsgStoreMailBox *mailBox = CMsgStoreMailBox::NewL( *iContext, aMailBoxId, propertiesBuf );
+    
+    CleanupStack::PopAndDestroy( &propertiesBuf );
+    
+    return mailBox;
+    }
+
+/** Creates a new account
+
+    \param aAccount, the info about the account to be created.
+    \retval an instance of CMsgStoreSession.
+    \note the caller ownes the return object.
+*/	
+EXPORT_C CMsgStoreMailBox* CMsgStore::CreateAccountL( const CMsgStoreAccount& aAccount, const CMsgStorePropertyContainer* aProperties )
+	{
+	CMsgStorePropertyContainer* properties = (CMsgStorePropertyContainer*)aProperties;
+	
+	if ( !aProperties )
+		{
+		properties = CMsgStorePropertyContainer::NewL();
+		CleanupStack::PushL( properties );
+		}
+	
+	RBuf8 serializedProperties;
+	CleanupClosePushL( serializedProperties );
+	properties->SerializeL( serializedProperties );
+	
+	TMsgStoreId mbId = iContext->iSession.CreateAccountL( aAccount, serializedProperties );
+	CMsgStoreMailBox *mailBox = CMsgStoreMailBox::NewL( *iContext, mbId, serializedProperties );
+	
+	CleanupStack::PopAndDestroy( &serializedProperties );
+	
+	if ( !aProperties )
+		{
+		CleanupStack::PopAndDestroy( properties );
+		}
+	
+	return mailBox;
+	}
+
+
+/** Rename an existing account
+
+    \param aOwnerId the account's UID
+    \param aOldName the old accout name
+    \param aNewName the new account name
+*/	
+EXPORT_C void CMsgStore::RenameAccountL( TInt32 aOwnerId, const TDesC& aOldName, const TDesC& aNewName )
+	{
+	iContext->iSession.RenameAccountL( aOwnerId, aOldName, aNewName );
+	}
+
+
+/** Deletes an existing account
+
+    \param aAccount, the info about the account to be deleted.
+*/	
+EXPORT_C void CMsgStore::DeleteAccountL( const CMsgStoreAccount& aAccount  )
+	{
+	iContext->iSession.DeleteAccountL( aAccount );
+	}
+
+/** List the existing accounts
+
+    \param aAccouns, on returns, filled with array of pointers of CMsgStoreAccounts
+    \retval KErrNone if successful, Symbian error code, otherwise.
+*/
+EXPORT_C void CMsgStore::AccountsL( RPointerArray<CMsgStoreAccount>& aAccounts )
+	{
+	iContext->iSession.AccountsL( aAccounts );
+	}
+
+/** Sets the "default" mailbox
+    \param aMailBoxId the id of the default mailbox
+*/
+EXPORT_C void CMsgStore::SetDefaultMailboxL( TMsgStoreId aMailBoxId  )
+    {
+    RPointerArray<CMsgStoreAccount> accounts;
+    AccountsL( accounts );
+    if ( accounts.Count() == 0 )
+        {
+        User::Leave( KErrNotReady );
+        }
+    CleanupResetAndDestroyClosePushL( accounts );
+    
+    TBool found = EFalse;
+    for ( TInt i = 0 ; i < accounts.Count() ; i++ )
+        {
+        CMsgStoreMailBox* mb = OpenAccountL( *accounts[i] );
+        CleanupStack::PushL( mb );
+        if ( mb->Id() == aMailBoxId )
+            {
+            mb->SetDefaultMailboxL( ETrue );
+            found = ETrue;
+            }
+        else
+            {
+            mb->SetDefaultMailboxL( EFalse );
+            }
+            
+        CleanupStack::PopAndDestroy( mb );
+        }
+    
+    CleanupStack::PopAndDestroy( &accounts );
+    
+    if ( !found )
+        {
+        User::Leave( KErrNotFound );
+        }
+    }
+
+EXPORT_C TMsgStoreId CMsgStore::DefaultMailboxL()
+    {
+    RPointerArray<CMsgStoreAccount> accounts;
+    AccountsL( accounts );
+    if ( accounts.Count() == 0 )
+        {
+        User::Leave( KErrNotFound );
+        }
+    CleanupResetAndDestroyClosePushL( accounts );
+    
+    RPointerArray<CMsgStoreMailBox> mailBoxes;
+    CleanupResetAndDestroyClosePushL( mailBoxes );
+    
+    TMsgStoreId defaultMailboxId = KMsgStoreInvalidId;
+    
+    for ( TInt i = 0 ; i < accounts.Count() && defaultMailboxId == KMsgStoreInvalidId ; i++ )
+        {
+        CMsgStoreMailBox* mb = OpenAccountL( *accounts[i] );
+        mailBoxes.Append( mb );
+        if ( mb->IsDefaultMailbox() )
+            {
+            defaultMailboxId = mb->Id();
+            }
+        }
+
+    if ( defaultMailboxId == KMsgStoreInvalidId )
+        {
+        //no default mailbox is set, check if there is a corporate mailbox,
+        // use it as default, if a corporate mailbox is found
+        for( TInt i = 0 ; i < mailBoxes.Count() ; i++ )
+            {
+            if ( mailBoxes[i]->IsCorporateMailbox() )
+                {
+                mailBoxes[i]->SetDefaultMailboxL( ETrue );
+                defaultMailboxId = mailBoxes[i]->Id();
+                break;
+                }
+            }
+        }
+    
+    if ( defaultMailboxId == KMsgStoreInvalidId )
+        {
+        //still no default mailbox found, compare the source id,
+        // the mb with the smallest source id was created first,
+        // use it as default
+        TUint curSourceId = 0;
+        for( TInt i = 0 ; i < mailBoxes.Count() ; i++ )
+            {
+            TUint index = 0 ;
+            if ( mailBoxes[i]->FindProperty(KIsPropertyEmailSourceId, index) )
+                {
+                TUint32 sourceId = mailBoxes[i]->PropertyValueUint32L( index );
+                if ( sourceId < curSourceId )
+                    {
+                    curSourceId = sourceId;
+                    defaultMailboxId = mailBoxes[i]->Id();
+                    }
+                }
+            }
+        }
+    
+    if ( defaultMailboxId == KMsgStoreInvalidId )
+        {
+        //if we still can't find the default, use the fist mailbox as default
+        defaultMailboxId = mailBoxes[0]->Id();
+        }
+    
+    CleanupStack::PopAndDestroy( &mailBoxes );
+    CleanupStack::PopAndDestroy( &accounts );
+    
+    return defaultMailboxId;    
+    }
+
+/** Enables the encryption to the entire message store. This method also triggers the 
+    message store to start encrypting (in the background) if it is not already encrypted.
+
+    \note If message store is already encrypted, this method will leave with KErrAlreadyExists 
+       and nothing will be changed
+*/
+EXPORT_C void CMsgStore::EnableEncryptionL( /*const TDesC& aPassword*/ )
+    {
+    iContext->iSession.EnableEncryptionL();
+    }
+
+
+/**
+    Disables the message store encryption. This method also triggers the 
+    message store to start decrypting (in the background) if it is encrypted.
+*/
+EXPORT_C void CMsgStore::DisableEncryptionL( /*const TDesC& aPassword*/ )
+    {
+    iContext->iSession.DisableEncryptionL();
+    }
+
+EXPORT_C void CMsgStore::SetMaxMruAddressCountL( TInt aMaxCount )
+    {
+    iContext->iSession.SetMaxMruAddressCountL( aMaxCount );
+    }
+
+/** Wipes the entire contents of a message store
+
+    This function will wipe the entire contents of the message store, including all messages and all
+    folders for all accounts
+
+    ECapabilityWriteUserData is required to use this function.			
+*/
+EXPORT_C void CMsgStore::WipeEverythingL()
+{
+	iContext->iSession.WipeEverythingL();
+}
+
+
+/** Adds an observer to the message store.
+
+	This function allows observation of events such as create/delete of an account, store wipe, and 
+    authentication events.
+	
+	No platform security capabilities are required to use this function.
+	
+	\note The observer will not be notified of message store operations (other than database wipe)
+	that are performed from the observer's own message store session.
+*/
+EXPORT_C void CMsgStore::AddObserverL( MMsgStoreObserver* aObserver )
+{
+	if( !iContext->iObserverHandler )
+	{	 
+    	iContext->iObserverHandler = CMsgStoreObserverHandler::NewL( iContext->iSession );
+	} // end if
+	    
+	iContext->iObserverHandler->AddObserverL( aObserver );
+}
+
+
+/** Removes an observer from the message store. 
+
+	No platform security capabilities are required to use this function.
+*/
+EXPORT_C void CMsgStore::RemoveObserverL( MMsgStoreObserver* aObserver )
+{
+	if( !iContext->iObserverHandler )
+	{
+    	User::Leave( KErrNotFound );
+	}
+	else
+	{	    
+    	iContext->iObserverHandler->RemoveObserverL( aObserver );
+	} // end if
+}
+
+
+/** Destructor */
+CMsgStore::~CMsgStore()
+{
+//<cmail>
+    if ( iContext )
+        {
+//</cmail>		
+        delete iContext->iObserverHandler;
+        // delete iContext->iSearchHandler;
+	
+        iContext->iSession.Close();
+//<cmail>		
+        }
+//</cmail>
+	
+	delete iContext;
+}
+