emailservices/emailclientapi/inc/emailapiutils.h
changeset 0 8466d47a6819
child 8 e1b6206813b4
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/emailservices/emailclientapi/inc/emailapiutils.h	Thu Dec 17 08:39:21 2009 +0200
@@ -0,0 +1,157 @@
+/*
+* 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: This file implements utilities like CPluginData.
+*
+*/
+
+#ifndef EMAILAPIUTILS_H
+#define EMAILAPIUTILS_H
+
+#include <e32base.h>
+#include "CFSMailCommon.h"
+#include <emailapidefs.h>
+
+//using namespace EmailInterface;
+
+class CFSMailPlugin;
+
+enum TDataOwner
+    {
+    EClientOwns,
+    EAPIOwns
+    };
+
+
+/**
+* Helper container class for storing plugin pointer and implementation UID
+* @since S60 v5.2
+*/
+NONSHARABLE_CLASS( TPluginData )
+    {
+    public:
+    
+        inline TPluginData( TUid aUid ) : iPlugin( NULL ), iUid( TUid::Uid( aUid.iUid ) ) {}
+        
+        CFSMailPlugin* iPlugin;
+        
+        const TUid     iUid;
+    };
+    
+/**
+* Plugin data is a utility for protocol plugin creation and book 
+* keeping. Objects using the plugin should access it via this
+* class for optimised reference counting.
+*/
+NONSHARABLE_CLASS( CPluginData ) : public CBase
+{
+public:    
+    /**
+    * returns plugin instance or null if failed to instantiate.
+    * LoadResult() will return error code in instantiation
+    */
+    CFSMailPlugin* ClaimInstance();
+    
+    /**
+    * returns plugin instance or leaves if failed to instantiate.
+    */
+    CFSMailPlugin* ClaimInstanceL();
+
+    /**
+    *  Decreases access count of the plugin and deletes if reaches zero.
+    * Note! this should be called only aftre succesful ClaimInstance or 
+    * ClaimInstanceL.
+    */
+    void ReleaseInstance();
+    
+    /**
+    * Adds cleanup operation calling ReleaseInstance to cleanup stack
+    */                                                 
+    void ReleasePushL();
+    /**
+    * Cleanup operation for CleanupReleasePluginPushL
+    */
+    static void CleanupOperation( TAny* aAny );
+    
+    TUid Uid() const;
+    
+    TInt LoadResult() const;
+
+private: 
+    /* only CEmailClientApi owns instances of this, it should make sure that
+     * no duplicates exist, otherwise reference counting of plugins fail
+     * (this is not singleton class)
+     */
+    friend class CEmailClientApi;
+    friend class CEmailMailboxCache;
+    
+    CPluginData( TUid aUid );
+    ~CPluginData();
+
+private:    
+    // plugin pointer and uid
+    TPluginData iData;
+    
+    TInt iPluginLoadError;
+        
+    // >0 when iPlugin is instantiated
+    TUint          iRefCount;
+    
+    // EFalse if shared from Email Framework (CFSMailClient). If true,
+    // ReleaseInstance() doesn't delete plugin
+    TBool          iOwned;
+};
+
+/**
+* Constructs internal message id type from plugin data and mailbox/folder/message id 
+*/
+TFSMailMsgId FsMsgId( const CPluginData& aPluginData, const EmailInterface::TBaseId& aId );
+
+/**
+* Cleanup support for pointer arrays
+*/
+template<class T>
+class CleanupResetAndDestroy
+{
+public:
+    inline static void PushL( T& aItem );
+
+private:
+    inline static void ResetAndDestroy( TAny *aPtr );
+} ;
+
+template <class T>
+inline void CleanupResetAndDestroyPushL( T& aRef )
+    {
+    CleanupResetAndDestroy<T>::PushL( aRef );
+    }
+
+/**
+* Cleanup support for email interface objects.
+*/
+class CleanupReleasePush
+{
+public:
+    static void PushL( EmailInterface::MEmailInterface& aItem );
+
+private:
+    static void Release( TAny *aPtr );
+} ;
+
+
+#include "emailapiutils.inl"
+
+
+#endif // EMAILAPIUTILS_H
+
+// End of file