email_plat/email_client_api/memailcontent.h
author Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
Fri, 17 Sep 2010 08:27:21 +0300
changeset 72 64e38f08e49c
parent 54 997a02608b3a
permissions -rw-r--r--
Revision: 201035 Kit: 201037

/*
* Copyright (c) 2010 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: ECom interface for Email Client API
*
*/

#ifndef MEMAILCONTENT_H
#define MEMAILCONTENT_H

#include <emailapidefs.h>

namespace EmailInterface {

_LIT( KContentTypeTextPlain, "text/plain" );
_LIT( KContentTypeTextHtml, "text/html" );

class MEmailOperationObserver;
class MEmailAttachment;
class MEmailMultipart;
class MEmailTextContent;
class MEmailMessageContent;

/**
* Callback interface used for content fetching asynchronously.
* Object deriving this interface is passed to MEmailMessageContent::FetchL
* @since S60 v5.0
*/
class MEmailFetchObserver
{
public:
    /** Content fetched
    * @param operation result 
    */
    virtual void DataFetchedL( const TInt aResult ) = 0;
};

typedef RPointerArray<MEmailMessageContent> REmailContentArray;

/**
* Base interface for mime message parts.
* @since S60 v5.0
*/
class MEmailMessageContent : public MEmailInterface
{
public:
    /** numeric identifier of message content */
    virtual TMessageContentId Id() const = 0;

// fields as per RFC 2045
    /**
     * return sContent-Type field value
     */
    virtual TPtrC ContentType() const = 0;

    /**
     * sets value of Content-Type field
     * @param content type
     */
    virtual void SetContentType( const TDesC& aContentType ) = 0;

    /**
    /* Returns Content-ID field value.
     * @return content id
     */
    virtual TPtrC ContentId() const = 0;

    /**
     * Sets value of Content-ID field
     * @param content id
     */
    virtual void SetContentId( const TDesC& aContentId ) = 0;

    /**
     * Returns value of content-description field
     * @return content description 
     */
    virtual TPtrC ContentDescription() const = 0;

    /**
     * Sets value of content description field
     * @param content description 
     */
    virtual void SetContentDescription( const TDesC& aContentDescription ) = 0;

    /**
     * Returns value of content disposition field
     * @return content disposition
     */
    virtual TPtrC ContentDisposition() const = 0;

    /**
     * Sets value of content-disposition field
     * @param content disposition
     */
    virtual void SetContentDisposition( const TDesC& aContentDisposition ) = 0;

// end of standard  RFC 2045 fields

    /**
     * returns Content-class field value (non-standard)
     */
    virtual TPtrC ContentClass() const = 0;

    /**
     * Sets value of Content-class field (non-standard)
     * @param content class
     */
    virtual void SetContentClass( const TDesC& aContentClass ) = 0;

    /**
     * Available (=fetched) size accessor. If this is less than value from
     * TotalSize(), Fetch() should be used to retrieve more data from
     * remote mail server.
     * @return fetched size of the data.
     */
    virtual TInt AvailableSize() const = 0;

    /**
     * Total size accessor
     * @return total size of message text.
     */
    virtual TInt TotalSize( ) const = 0;

    /**
     * Returns pointer descriptor to content data
     */
    virtual TPtrC ContentL() const = 0;

    /**
     * Sets content data.
     */
    virtual void SetContentL( const TDesC& aContent ) = 0;

    /**
     * Starts fetching rest of content asynchronously.
     *
     * If available size after fetch is smaller than total size, next chunk can
     * be fetched with new invocatin of Fetch method.
     *
     * Calling Release() implicitly cancels fetching.
     * @param aObserver called when when fetch completes.
     * @exception KErrInUse if fetch is ongoing
     */
    virtual void FetchL( MEmailFetchObserver& aObserver ) = 0;

    /**
     * Cancels fetch operation, observer is not called
     */
    virtual void CancelFetch() = 0;

    /**
     * Stores message content to a file
     */
    virtual void SaveToFileL( const TDesC& aPath ) = 0;

    /**
     * Typesafe multipart accessor for obtaining MEmailMultipart pointer
     * to this object.
     * @param content as multipart or NULL if content is not multipart
     */
    virtual MEmailMultipart* AsMultipartOrNull() const = 0;

    /**
     * Typesafe text content accessor for obtaining MEmailTextContent pointer
     * to this object.
     * @param content as text content or NULL if content is not text
     */
    virtual MEmailTextContent* AsTextContentOrNull() const = 0;

    /**
     * Typesafe attachment content accessor for obtaining MEmailAttachment pointer
     * to this object.
     * @param content as attachment content or NULL if content is not an attachment
     */
    virtual MEmailAttachment* AsAttachmentOrNull() const = 0;
};

/**
* Convenience abstraction for manipulating plain or html text content. Use
* CEmailInterfaceFactory::InterfaceL( KEmailIFUidTextContent ) to make new
* instance of this interface.
* @since S60 v5.0
*/
class MEmailTextContent : public MEmailMessageContent
{
public:
    /**
     * Text (content) type 
     */
    enum TTextType {
        EPlainText, // text/plain
        EHtmlText   // text/html
    };

    /**
    * Tells if content has specified type of text.
    */
    virtual TTextType TextType() const = 0;

    /**
    * Sets (replaces) text to message content. Possible old content is
    * deleted. Content type is set to "text/plain" or "text/html" based on
    * specified text type.
    * @param aPlainOrHtml sub-type of the text
    * @param aText content of the message part
    */
    virtual void SetTextL(
        const TTextType aPlainOrHtml,
        const TDesC& aText ) = 0;
};

/**
* Message part with multiple sub parts. If MEmailMessage::ContentL returns
* content with type "multipart/*" (where '*' is a character sequence) it can
* safely be casted to MEmailMultipart
* @since S60 v5.0
*/
class MEmailMultipart : public MEmailMessageContent
{
public:
    /**
    * Returns number of child parts
    */
    virtual TInt PartCountL() = 0;

    /**
    * Returns a child part, ownership is transferred.
    * @param aIndex part to return, leaves KErrArgument if out of bounds
    */
    virtual MEmailMessageContent* PartByIndexL( const TUint aIndex ) const = 0;

    /**
    * Deletes part by index.
    * @param aIndex part to delete, leaves KErrArgument if out of bounds
    */
    virtual void DeletePartL( const TUint aIndex ) = 0;

    /**
    * Adds message part, ownership is transferred.
    * @param aPart any object derived from MEmailMessageContent
    * @param aPos position among child parts
    */
    virtual void AddPartL(
        const MEmailMessageContent& aPart,
        const TUint aPos ) = 0;
};

typedef RPointerArray<MEmailAttachment> REmailAttachmentArray;

/**
* Email attachment interface
* Attachment is created with MEmailMessage::AddAttachmentL()
* @since S60 v5.0
*/
class MEmailAttachment : public MEmailMessageContent
{
public:
      /**
      * Returns file handle of this attachment. If the attachment is
      * not associated with a file, null file handle is returned.
      */
      virtual RFile FileL() const = 0;

      /**
      * Sets file name field
      */
      virtual void SetFileNameL( const TDesC& aFileName ) = 0;

      /**
      * Returns file name or null pointer descriptor if attachment
      * is not associated with any file
      */
      virtual TPtrC FileNameL() const = 0;
};

} // namespace EmailInterface

#endif // MEMAILCONTENT_H