emailservices/emailclientapi/inc/emailclientapiimpl.h
changeset 0 8466d47a6819
child 4 e7aa27f58ae1
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/emailservices/emailclientapi/inc/emailclientapiimpl.h	Thu Dec 17 08:39:21 2009 +0200
@@ -0,0 +1,300 @@
+/*
+* 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: Definition of Email API main interface.
+*
+*/
+
+#ifndef EMAILCLIENTAPIIMPL_H
+#define EMAILCLIENTAPIIMPL_H
+
+
+#include <ecom/ImplementationInformation.h> 
+#include "emailapiutils.h"
+#include "cfsmailcommon.h"
+//#include "emailinternalclientapi.h"
+#include "mfsmaileventobserver.h"    
+#include <memailclientapi.h>
+#include "emailclientpluginmanager.h"
+
+
+using namespace EmailInterface;
+
+class CFSMailBox;
+class MEmailEventObserver;
+class CVwsSessionWrapper;
+class CFSMailPlugin;
+class TFSMailMsgId;
+class CEmailMailboxCache;
+class CFSClientAPI;
+
+/**
+*  "Framework" class including plugin management
+* @since S60 v5.2
+*/
+NONSHARABLE_CLASS( CEmailClientApi ) : public CBase, public MEmailClientApi, public MEmailClientPluginManager
+{
+public:
+    /**
+    * Constructor
+    * @return
+    */
+    static CEmailClientApi* NewL();
+    
+    /**
+     * Destructor
+     */
+    ~CEmailClientApi();
+    
+    /**
+     *
+     */
+     CEmailClientApi();       
+
+public: // from MEmailInterface
+    virtual TEmailTypeId InterfaceId() const;
+    
+    virtual void Release();
+    
+public: // from MEmailClientApi
+
+    /** @see MEmailClientApi */   
+    virtual MEmailMailbox* MailboxL( const TMailboxId& aId );
+   
+    /** @see MEmailClientApi */   
+    virtual MEmailMailbox* MailboxL( const TPtrC& aAddress );
+           
+    /**
+    * Gets all mailboxes in pointer array. It is recommended to free other
+    * mailboxes besides needed one to optimise memory usage.
+    */    
+    virtual TInt GetMailboxesL( RMailboxPtrArray& aMailboxes );
+    
+    /**
+    */
+    virtual void LaunchEmailL( const TLaunchPolicy aPolicy );
+    
+public: // from MEmailPluginManager
+    virtual CFSMailPlugin* GetPluginByUid(TUid aUid);    
+
+public: // new methods
+
+    /**
+     * Gets array of mailbox ids
+     * @param aMailboxes mailbox ids from all plugins
+     * @return number of mailboxes returned in aMailboxes
+     */
+    TInt GetMailboxIdsL( REmailMailboxIdArray& aMailboxes );
+        
+private:
+
+    /**
+     * Constructor
+     */
+    void ConstructL();
+
+    /**
+     * Push ECom implementation info to cleanup operation to cleanup stack
+     */
+    void CleanupImplInfoPushL( RPointerArray<CImplementationInformation>& aArray );
+    
+    /**
+     * Cleanup operation for ECom implementation info
+     */
+    static void CleanupImplInfo( TAny* aAny );
+   
+
+    // Group of methods for book keeping of loaded protocol plugins by this object.
+    // In certain situations it is preferable to have a plugin in memory
+    // instead of loading/unloading frequently.
+    
+    /** Increases plugin reference count if CEmailClientApi already doesn't
+     *  have active instance. When plugin is needed internally, this method
+     * should be accessor to a plugin. Counterpart is ReleasePlugin() when
+     * CEmailClientApi doesn't itself need plugin any more.
+     */
+    CFSMailPlugin* UsePlugin( CPluginData& aPluginData );
+    
+    /**
+    * For finding plugin data
+    */
+    TInt IndexOfLoadedPluginData( const TPluginData& aPluginData ) const;
+    
+    /**
+    * Used in comparing plugin data in array (part of find algorithm)
+    */    
+    static TBool PluginDataEquals( const TPluginData& a1, const TPluginData& a2 );
+    
+    /**
+    * This object doesn't need related protocol plugin
+    */
+    void ReleasePlugin( CPluginData& aPluginData );
+    
+    /**
+    * This object doesn't need any protocol plugin
+    */
+    void ReleaseAllPlugins();
+    
+    /**
+    * Return mailbox cache, creates it when called first time
+    */
+    CEmailMailboxCache& MailboxInfoCacheL();
+    
+    /**
+    * Caches mailbox ids and their mapping to related plugin data for quick
+    * lookup. When a mailbox with specific id is next time asked, related
+    * protocol plugin is already known.
+    */
+    void UpdateMailboxInfoCacheL();
+
+    /**
+    * Internal, used from UpdateMailboxInfoCacheL
+    */    
+    TBool CachePluginMailboxesL( 
+        CPluginData& aPluginData, 
+        CFSMailPlugin& aPlugin );
+    
+private:    
+    typedef RPointerArray<CPluginData> RPluginDataArray;
+    
+    /**
+    * Iterator for CPluginData elements in an array
+    */
+    class TPluginIterator
+    {
+    public:
+        // constructor
+        inline TPluginIterator( RPluginDataArray& aArray ) : 
+            iArray( aArray ), iIndex( 0 ) {}
+        
+        /**
+        * return next element
+        */
+        CPluginData* Next();
+    private:
+        // iterator array
+        RPluginDataArray& iArray;
+        // current iterator index
+        TInt iIndex;
+    };
+#if 0 // Not supported    
+    /**
+     * Internal helper class for handling events related to mailboxes
+     *(adding/removal/rename).
+     */
+    class CObserverHandler : public CBase, public MFSMailEventObserver
+    {
+    public:
+        static CObserverHandler* NewL( const RPluginDataArray& aArray  );
+        ~CObserverHandler();
+        CObserverHandler( const RPluginDataArray& aArray );
+        void ConstructL();
+        void AddObserverL( MMailboxEventObserver& aObserver );
+        void RemoveObserver( MMailboxEventObserver& aObserver );
+        
+    public: // from MFSMailEventObserver
+
+        virtual void EventL(TFSMailEvent aEvent, TFSMailMsgId aMailbox, TAny* aParam1, TAny* aParam2, TAny* aParam3);
+    
+    private: // new methods
+        
+        // used for finding oberver
+        static TBool Equals( const MMailboxEventObserver& a1, const MMailboxEventObserver& a2 );
+        
+        // Plugins needed when first observer subscribes events
+        void ClaimPluginsAndStartObservingL();
+        
+        // plugins can be released when last observer removed
+        void ReleasePlugins();
+                
+    private: // data
+
+        // Plugin refCount is incremented by one while any observer is 
+        // registered. This prevents plugin unloading if no other entity uses 
+        // the plugin. 
+        class TEntry
+        {
+        public:
+            inline TEntry( CPluginData& aData ) : iData( aData ), iPlugin( NULL ) {}
+            CPluginData& iData;    
+            
+            // claimed from same object where iData refers to
+            CFSMailPlugin* iPlugin;
+        };
+        
+        // plugin entry array
+        RArray<CObserverHandler::TEntry>     iEntryArray;
+        
+        // reference to CEmailClientApi::iPluginDataArray
+        const RPluginDataArray&              iPluginDataArray;
+        
+        // registered observers
+        RPointerArray<MMailboxEventObserver> iMailboxObservers;
+    };
+#endif    
+    /**
+     * Returns reference to observer handler.
+     */
+#if 0 // Not supported    
+    CEmailClientApi::CObserverHandler& ObserverHandlerL();
+#endif    
+    
+private:
+    // plugin data array for all protocol plugins
+    RPluginDataArray    iPluginDataArray;
+    
+    // book keeping of loaded plugins
+    RArray<TPluginData> iLoadedPluginsArray;
+    
+#if 0 // Not supported    
+    // orchestrates event monitoring and related plugin references
+    CEmailClientApi::CObserverHandler*   iObserverHandler;
+    
+#endif
+    
+    // Mailbox ids are cached when first time listed. Related plugin uid
+    // is include in the cache.
+    CEmailMailboxCache* iMailboxCache;
+
+    CFSClientAPI* iClientAPI;
+    
+};
+
+/**
+* Email application launcher. 
+*/
+NONSHARABLE_CLASS( CEmailLauncher ) : public CBase
+{
+public:
+    static CEmailLauncher* NewL();
+    
+    ~CEmailLauncher();
+                                    
+    /**
+    *
+    */
+     void LaunchL( const TMailboxId& aMailboxId );
+private:
+    
+    CEmailLauncher();
+    
+    void ConstructL();
+    
+    // Owned window server session.
+    CVwsSessionWrapper* iViewSrvSession;
+};
+
+
+#endif // EMAILCLIENTAPIIMPL_H
+
+// End of file.