diff -r 000000000000 -r 8466d47a6819 emailservices/emailframework/commonlib/inc/cemailextensionbase.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/emailservices/emailframework/commonlib/inc/cemailextensionbase.h Thu Dec 17 08:39:21 2009 +0200 @@ -0,0 +1,152 @@ +/* +* 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: Meeting Request calendar info object extension +* +*/ + +#ifndef CEMAILEXTENSIONBASE_H +#define CEMAILEXTENSIONBASE_H + +#include + +/** +* Base class for extensions. Instances of subclasses are requested from +* CExtendableEmail::ExtensionL() with specific extension UID. +* When client has ended using an extension it must be released with +* CExtendableEmail::ReleaseExtension(). +* @since s60 v5.0 +*/ +class CEmailExtension : public CBase +{ + +public: + IMPORT_C ~CEmailExtension(); +protected: + IMPORT_C CEmailExtension( const TUid& aUid ); +public: + + /** + * returns extension uid + * @return uid of the extension. + */ + IMPORT_C TUid Uid() const; + +public: // for internal use + + /** + * Decrement reference count. + * @return new value of ref count + */ + TUint DecRef(); + + /** + * Increment reference count. + */ + void IncRef(); + +private: + + + // extension interface UID defined by specific interface. + const TUid iUid; + + // Reference count is needed because more than one client may request + // same extension (e.g. UI and protocol plugin). + TUint iRefCount; +}; + +/** +* helper class for managing extensions. In most cases needed only +* by CExtendableEmail when extensions are created/released. Proto +* @since s60 v5.0 +*/ +class TEmailExtensions +{ +public: + + /** + * c++ constructor + */ + IMPORT_C TEmailExtensions(); + + /** + * Destructor + */ + IMPORT_C ~TEmailExtensions(); + + /** + * Returns extension index in iExtensions + @ return extension index or KErrNotFound + */ + IMPORT_C TInt FindExtension( const TUid& aUid ) const; + + /** + * Returns extension by index or panics if invalid index is given + * @param aIndex index in iExtensions + * @panic EEmailExtensionIndexOutOfRange if index is out of range + * @return extension + */ + IMPORT_C CEmailExtension* Extension( const TInt aIndex ) const; + + /** + * Adds extension to iExtensions array and increments its ref count by one. + * + * @param aExtenstion extension to add + * @leave KErrArgument if aExtension is NULL + */ + IMPORT_C void AddL( CEmailExtension* aExtension ); + + /** + * Removes extension from iExtensions + * @param aExtenstion extension to remove + */ + IMPORT_C void Remove( const CEmailExtension* aExtension ); + +private: + // array of extensions + RPointerArray iExtensions; +}; + +/** +* Classes that support email extension mechanism by returning extensions by +* uid should have this as base class. +* +* @since s60 v5.0 +*/ +class CExtendableEmail : public CBase +{ +public: + /** + * Decrements extension reference count and deletes if count reaches 0. + * Derived class must call this if it overrides this method. + * @param aExtension extension to release + */ + IMPORT_C virtual void ReleaseExtension( CEmailExtension* aExtension ); + + /** + * Requests extension. Default implementation performs lookup only and + * derived class should implement actual instantiation because it knows + * extensions it supports. Derived class must always call this to ensure + * that extension is not created twice. + * + * @param aExtension extension to release + */ + IMPORT_C virtual CEmailExtension* ExtensionL( const TUid& aInterfaceUid ); + +protected: + // extension containment + TEmailExtensions iExtensions; +}; + +#endif // CEMAILEXTENSIONBASE_H