/*
* Copyright (c) 2005 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:  
*       CUniObject, Storage for single attachment in presentation. 
*
*/




#ifndef __UNIOBJECT_H
#define __UNIOBJECT_H

// INCLUDES

#include <e32std.h>
#include <msvstd.h>     // for TMsvId
#include <cmsvattachment.h>

#include <DRMEvent.h>
#include <DRMEventObserver.h>

#include <MsgMedia.hrh>

#include <unimodelconst.h>

// CONSTANTS
const TUid KUidAttachmentIndication = {0x10282CB0};

// MACROS

// FORWARD DECLARATIONS
class CUniMimeInfo;
class CMsgMediaInfo;
class CUniDrmInfo;
class CBaseMtm;
class CUniDataUtils;
class CMsvStore;
class MMsvAttachmentManager;
class CUniObject;
class CDRMNotifier;
// DATA TYPES

// FUNCTION PROTOTYPES

// CLASS DECLARATION

/**
* MUniObjectSaveObserver - Callback API for object saving.
*
* @since 3.1
*/
class MUniObjectSaveObserver
    {
    public:
        virtual void ObjectSaveReady( TInt aError ) = 0;
    };
    
enum TUniObjectEvent
    {
	EUniObjectEventDrmRightsChanged = 0
    };

class MUniObjectObserver
    {
    public:
        virtual void HandleUniObjectEvent(  CUniObject&  aUniObject,
                                            TUniObjectEvent aUniEvent ) = 0;
    };

/**
* CUniObject - Representation of a single attachment of a message.
*
* @lib UniDataModel.lib
* @since 3.1
*/
class CUniObject : public CActive,
                   public MDRMEventObserver

    {

    public:  // New methods

        /**
        * Factory method that creates this object
        * from an attachment.
        *
        * @since    3.1
        * @param    aMtm    IN reference to client mtm
        * @param    aMedia  IN initialized media info object - takes ownership!
        * @param    aManager        IN reference to attachment manager
        * @param    aAttachmentId   IN id of the attachment from
        *                           which to create the object
        * @return   Pointer to instance in cleanup stack
        */
        IMPORT_C static CUniObject* NewLC(
            RFs& aFs,
            CBaseMtm& aMtm,
            CUniDataUtils& aData,
            CMsgMediaInfo* aMedia,
            MMsvAttachmentManager& aManager,
            CMsvAttachment& aAttachment );

        /**
        * Factory method that creates this object
        * from an attachment.
        *
        * @since    3.1
        * @param    aMtm    IN reference to client mtm
        * @param    aMedia  IN initialized media info object - takes ownership!
        * @param    aAttachmentId   IN id of the attachment from
        *                           which to create the object
        * @return   Pointer to instance
        */
        IMPORT_C static CUniObject* NewL(
            RFs& aFs,
            CBaseMtm& aMtm,
            CUniDataUtils& aData,
            CMsgMediaInfo* aMedia,
            MMsvAttachmentManager& aManager,
            CMsvAttachment& aAttachment );

        /**
        * Factory method that creates this object
        * from a file.
        *
        * @since    3.1
        * @param    aData   IN reference to MsgData object
        * @param    aMedia  IN initialized media info object - takes ownership!
        * @return   Pointer to instance in cleanup stack
        */
        IMPORT_C static CUniObject* NewLC(
            RFs& aFs,
            CBaseMtm& aMtm,
            CUniDataUtils& aData,
            CMsgMediaInfo* aMedia );

        /**
        * Factory method that creates this object
        * from a file.
        *
        * @since    3.1
        * @param    aData   IN reference to MsgData object
        * @param    aMedia  IN initialized media info object - takes ownership!
        * @return   Pointer to instance
        */
        IMPORT_C static CUniObject* NewL(
            RFs& aFs,
            CBaseMtm& aMtm,
            CUniDataUtils& aData,
            CMsgMediaInfo* aMedia );

        /**
        * Destructor
        *
        * @since    3.1
        */
        virtual ~CUniObject();

        /**
        * Save
        * Save the object to message store.
        * If leave occurs, attachment is cleaned up from the
        * message store.
        *
        * @since    3.1
        * @param    aObserver   IN operation observer
        * @param    aSaveType   IN save type
        */
        virtual void Save(
            MUniObjectSaveObserver& aObserver,
            CMsvAttachment::TMsvAttachmentType aSaveType );

        /**
        * Remove from store
        * Removes attachment from message store.
        *
        * @since    3.1
        * @param    aMtm    IN reference to MMS client mtm
        */
        virtual void RemoveFromStoreL();

        /**
        * AttachmentId
        * Accessor.
        *
        * @since    3.1
        * @return   Attachment id of the object
        */
        inline TMsvAttachmentId AttachmentId() const;

        /**
        * MimeInfo
        * Accessor.
        *
        * @since    3.1
        * @return   Pointer to the object's mime header class
        */
        inline CUniMimeInfo* MimeInfo() const;

        /**
        * DrmInfo
        * Accessor.
        *
        * @since    3.1
        * @return   Pointer to the object's mime header class
        */
        inline CUniDrmInfo* DrmInfo() const;

        /**
        * MimeType
        * Returns the mime type of the object. Use this instead
        * of MimeInfo's or MediaInfo's mime type unless you are
        * absolutely sure what you are doing.
        *
        * @since    3.1
        * @return   Mime type of the object.
        */
        IMPORT_C TPtrC8 MimeType() const;

        /**
        * MediaInfo
        * Accessor.
        *
        * @since    3.1
        * @return   Pointer to the object's media info class
        */
        inline CMsgMediaInfo* MediaInfo() const;

        /**
        * MediaType
        * Returns the media type of the object. Use this instead
        * of MediaInfo's media type unless you are absolutely
        * sure what you are doing.
        *
        * @since    3.1
        * @return   Media type of the object.
        */
        IMPORT_C TMsgMediaType MediaType() const;

        /*
        * Size
        *
        * @since    3.1
        * @param    aWithoutHeaders IN if ETrue include MIME headers' sizes
        *                           if EFalse count only file sizes
        * @return   Size of the object in bytes
        */
        virtual TInt Size( TBool aWithoutHeaders = ETrue );

        /**
        * Corrupted
        * Accessor.
        *
        * @since    3.1
        * @return   ETrue, if object corrupted,
        *           EFalse otherwise
        */
        inline TBool Corrupted() const;

        /**
        * SetCorrupted
        * Mutator.
        *
        * @since    3.1
        * @param    aCorrupted  IN ETrue to mark object corrupted
        */
        inline void SetCorrupted( TBool aCorrupted );

        /**
        * StoreState
        * Accessor.
        *
        * @since    3.1
        * @return   Store state of the object:
        *           EStoreStateAttachment if object is stored into message store and "visible"
        *           EStoreStateTemporary if is not yet in message store
        *           EStoreStateHidden if object is stored into message store and "hidden"
        */
        //inline TMsgObjectStoreState StoreState() const;

        /**
        * SetReferenceCount
        * Mutator.
        *
        * @since    3.1
        * @param    aCount  IN number of times the object is referenced in
        *                   the message (normally in the SMIL).
        */
        inline void SetReferenceCount( TInt aCount );

        /**
        * ReferenceCount
        * Accessor.
        *
        * @since    3.1
        * @return   Number of times the object is referenced in
        *           the message (normally in the SMIL).
        */
        inline TInt ReferenceCount() const;

        /**
        * SetRegion
        * Mutator.
        *
        * @since    3.1
        * @param    region object is in SMIL
        */
        inline void SetRegion( TUniRegion aRegion );

        /**
        * Region
        * Accessor.
        *
        * @since    3.1
        * @return   region object is in SMIL
        */
        inline TUniRegion Region() const;

        /**
        * SetMediaTypeBySmilTag
        * Mutator.
        *
        * @since    3.1
        * @param    media type by SMIL media tag
        */
        inline void SetMediaTypeBySmilTag( TMsgMediaType aMediaType );

        /**
        * ReferenceCount
        * Accessor.
        *
        * @since    3.1
        * @return   media type by SMIL media tag
        */
        inline TMsgMediaType MediaTypeBySmilTag() const;
                
        /**
        * SetUniqueControlHandle
        * Mutator.
        *
        * @since    3.2
        * @param    UniqueControlHandle, -1 for "resetting".
        */
        inline void SetUniqueControlHandle( TInt aUniqueControlHandle );

        /**
        * UniqueControlHandle
        * Accessor.
        *
        * @since    3.2
        * @return   UniqueControlHandle, -1 if not set.
        */
        inline TInt UniqueControlHandle() const;
                
        /**
        * SetAttachment
        * Mutator.
        *
        * @since    3.2
        * @param    aObjectAttachment ETrue if object is attachment, otherwise EFalse
        */
        inline void SetAttachment( TBool aObjectAttachment );

        /**
        * Attachment
        * Accessor.
        *
        * @since    3.2
        * @return   ETrue if object is attachment, otherwise EFalse
        */
        inline TBool Attachment() const;
        
        /**
        * IsSaved
        * Accessor.
        *
        * @since    3.2
        * @return   Information whether this object has been saved into file system
        *           in Viewer.
        */
        inline TBool IsSaved( );

        /**
        * IsSaved
        * Mutator.
        *
        * @since    3.2
        * @param    aSaved ETrue attachment has been saved
        *                  EFalse attachment has not been saved
        */
        inline void SetSaved( TBool aSaved );

        /**
        * IsDrmRightsWhenLoaded. Function is applicable only, if DrmInfo exists.
        * Accessor.
        *
        * @since    5.0
        * @return   Checks whether object had DRM rights when this object was loaded 
        *           into screen. If last DRM rights were consumed during loading, 
        *           it returns ETrue.
        *           
        */
        inline TBool IsDrmRightsWhenLoaded( ) const;

        /**
        * ResolveDrmRightsWhenLoadedL. Saves information whether this object had DRM
        *           rights when slide having the object was loaded. Uses 
        *           CDrmInfo::EvaluateRights() to resolve status
        * Mutator.
        *
        * @since    5.0
        *           
        */
        IMPORT_C void ResolveDrmRightsWhenLoadedL( );

        /**
        * SetDrmRightsWhenLoadedL. Saves information whether this object had DRM
        *            rights when slide having the object was loaded. 
        * Mutator.
        *
        * @since    5.0
        * @param    aRights ETrue: objects had rights, which were already consumed or if not consumed,
        *                   have still rights left
        *                   EFalse: rights have not been consumed and they are not left
        *           
        */
        IMPORT_C void SetDrmRightsWhenLoaded( TBool aRights );

        /**
        * IsDrmRightsWhenLoadedObjects. Function is applicable only, if DrmInfo exists.
        * Accessor.
        *
        * @since    5.0
        * @return   Checks whether object had DRM rights when this object was loaded 
        *           into screen in the Objects view. If last DRM rights were consumed during loading, 
        *           it returns ETrue.
        *           
        */
        inline TBool IsDrmRightsWhenLoadedObjects( ) const;

        /**
        * SetDrmRightsWhenLoadedObjects. Saves information whether this object had DRM
        *            rights when slide having the object was loaded into screen in the 
        *            Objects view. 
        * Mutator.
        *
        * @since    5.0
        * @param    aRights ETrue: objects had rights, which were already consumed or if not consumed,
        *                   have still rights left
        *                   EFalse: rights have not been consumed and they are not left
        *           
        */
        IMPORT_C void SetDrmRightsWhenLoadedObjects( TBool aRights );

        /**
        * Sets observer of UniObject events. Several observers are supported at the same time.
        * Mutator.
        *
        * @since    5.0
        * @param    aObserver observer
        *           
        */
        IMPORT_C void SetObserverL(  MUniObjectObserver* aObserver );                       

        /**
        * Removes observer of UniObject events.
        * Accessor.
        *
        * @since    5.0
        *           
        */
        IMPORT_C void RemoveObserver(   MUniObjectObserver*     aObserver );
        
        /**
         * Is object path is valid
         *
         * @return ETrue, if media object is available in their respective path 
         * otherwise EFalse
         */
        IMPORT_C TBool IsValid() const;

    protected: 

        /**
        * From CActive
        */
        void DoCancel();

        /**
        * From CActive
        */
        void RunL();
    
        /**
        * From CActive
        */
        TInt RunError( TInt aError );

    protected: 

        /**
        * Constructor.
        *
        * @since    3.1
        */
        CUniObject(
            RFs& aFs,
            CBaseMtm& aMtm,
            CUniDataUtils& aData,
            CMsgMediaInfo* aMedia );

        /**
        * 2nd phase constructor.
        *
        * @since    3.1
        */
        void ConstructL();

        /**
        * 2nd phase constructor.
        *
        * @since    3.1
        * @param    aManager        IN reference to attachment manager
        * @param    aAttachmentId   IN id of the attachment from
        *                           which to create the object
        */
        void ConstructFromAttachmentL(
            MMsvAttachmentManager& aManager,
            CMsvAttachment& aAttachment );

        /**
        * CreateMimeInfoL
        * Create mime info for the object from the file information
        * and in-parameters.
        *
        * @since    3.1
        */
        void CreateMimeInfoL();

        /**
        * CreateAttachmentL
        * Creates an attachment to message store.
        * If leave occurs, attachment is cleaned up from the
        * message store.
        *
        * @since    3.1
        */
        void CreateAttachmentL( );

        /**
        * SetHiddenL
        * Sets attachment "hidden" or "visible"
        * "Hidden" means InPreparation flag is set on and
        * "visible" means InPreparation flag is set off
        * Not to be called for "temporary" object
        *
        * @since    3.1
        * @param    aHidden IN ETrue for "hidden", EFalse for "visible"
        */
        //void SetHiddenL( TBool aHidden );

        virtual void DoSaveL();

        void StartObjectSaveL();
        void FinalizeObjectSaveL();
        
        void CompleteSelf();
                
        /// From MDRMEventObserver         
        virtual void HandleEventL( MDRMEvent* aEvent );

                
    protected: // data
    
        enum TMsgObjectSaveState
            {
            EObjectSavingIdle,
            EObjectCreatingAttachment
            };
        
        enum TMsgObjectFlags
            {
            EObjectCorrupted = 0x1,
            EObjectAttachment = 0x2,
            EObjectDrmRightsWhenLoaded = 0x4,
            EObjectDrmRightsWhenLoadedObjects = 0x8
            };
        
        RFs&                    iFs;
        CBaseMtm&               iMtm;
        CUniDataUtils&          iData;

		TInt                    iSupportedFeatures;
		
        TMsvAttachmentId        iAttachmentId;  // Attachment id of object. Can be id to Link file in store or to real atta.
        
        CUniMimeInfo*           iMimeInfo;      // Contains objects mime headers.
        CMsgMediaInfo*          iMediaInfo;     // Contains objects media information.
        CUniDrmInfo*            iDrmInfo;        
        TInt                    iObjectFlags;
        TInt                    iReferenceCount;
        //TMsgObjectStoreState    iStoreState;
        TUniRegion              iRegion;
        TMsgMediaType           iMediaTypeBySmilTag;
        TInt                    iUniqueControlHandle;

        MUniObjectSaveObserver* iObserver;
        CMsvAttachment::TMsvAttachmentType iSaveType;

        MMsvAttachmentManager*  iManager;
        CMsvAttachment*         iAttachment;
        CMsvStore*              iEditStore;
        TInt                    iSaveState;

        TBool                   iSavedToFs;
        RFile                   iFileHandle;

        CDRMNotifier*           iDrmNotifier;
        CArrayPtrFlat<MUniObjectObserver>* iObservers;
                
    };

#include <uniobject.inl>

#endif // __UNIOBJECT_H
