mpx/collectionframework/collectionutility/inc/mpxcollectionutilityimpl.h
author Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
Thu, 17 Dec 2009 08:55:47 +0200
changeset 0 a2952bb97e68
permissions -rw-r--r--
Revision: 200949 Kit: 200951

/*
* Copyright (c) 2006 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:  Implementation of interface for Collection Utility
*
*/



#ifndef CMPXCOLLECTIONUTILITY_H
#define CMPXCOLLECTIONUTILITY_H


#include <mpxcollectionobserver.h>
#include <mpxcollectionmessage.h>
#include <mpxsession.h>
#include <mpxmessageobserver.h>

#include "mpxcollectionserverdefs.h"
#include "mpxcollectionutility.h"

class CMPXMessageMonitor;
class CMPXTaskQueue;
class CMPXMsgBuf;
class CMPXMedia;

/**
*  Implementation of collection utility interface
*/
NONSHARABLE_CLASS(CMPXCollectionUtility) : public CActive,
                                           public MMPXCollectionUtility,
                                           public MMPXMessageObserver,
                                           public MMPXCollection

    {
public:
    /**
    * Two-phased constructor
    *
    * @param aObs observer
    * @param aModeId collection mode id
    * @return object of constructed
    */
    static CMPXCollectionUtility* NewL(const TUid& aModeId,
                                       MMPXCollectionObserver* aObs);

    /**
    * Destructor
    */
    ~CMPXCollectionUtility();

private:
    /**
    * C++ constructor
    */
    CMPXCollectionUtility(MMPXCollectionObserver* aObs);

    /**
    * Second phase constructor
    *
    * @param aModeId collection mode id
    */
    void ConstructL(const TUid& aModeId);

public:

    /**
    *  From MMPXCollectionUtility
    *  The collection.
    *
    *  @return the collection
    */
    MMPXCollection& Collection();

    /**
    * From MMPXCollectionUtility
    * Retrieves the ID of the collection plugin which matched aUids best.
    * If multiple plugins match the aUids, the only one with high priority will
    * be returned
    *
    * @param aUids, selection criteria
    * @return TUid containing the implementation UID of the collection that
    * would be selected
    */
    TUid CollectionIDL(const TArray<TUid>& aUids);

    /**
    *  From MMPXCollectionUtility
    *  Frees up client side resources only; a collection is freed when there are no
    *  clients using it, and all resources are freed when the last client closes
    */
    void Close();

    /**
    *  From MMPXCollection
    *  Opens the collection in its current state
    *
    *  Calls back MMPXCollectionObserver::HandleOpenL() with CMPXMedia object
    *  with ID KMPXMediaIdContainer, i.e.contains other media objects
    *
    *  @param aMode, open mode
    */

    void OpenL(TMPXOpenMode aMode=EMPXOpenDefault);

    /**
    *  From MMPXCollection
    *  Opens the collection at a specific index
    *
    *  Calls back MMPXCollectionObserver::HandleOpenL() with CMPXMedia object
    *  with ID KMPXMediaIdContainer, i.e.contains other media objects
    *
    *  @param aIndex, the index into the currently opened item list
    *  @param aMode, type of open mode
    */
    void OpenL(TInt aIndex,TMPXOpenMode aMode=EMPXOpenDefault);

    /**
    *  From MMPXCollection
    *  Opens the collection at a specific level
    *
    *  @param aPath, the path of the collection
    *  @param aMode, open mode
    *
    *  Calls back MMPXCollectionObserver::HandleOpenL()
    */
    void OpenL(const CMPXCollectionPath& aPath,
                TMPXOpenMode aMode=EMPXOpenDefault);

    /**
    *  From MMPXCollection
    *  Opens the collection at a specific index
    *
    *  Calls back MMPXCollectionObserver::HandleOpenL() with CMPXMedia object
    *  with ID KMPXMediaIdContainer, i.e.contains other media objects which will
    *  contain the attribute values specified by aAttrs
    *
    *  @param aIndex, the index into the currently opened item list
    *  @param aAttrs, attributes requested.
    *  @param aMode, type of open mode
    */
    void OpenL(TInt aIndex,const TArray<TMPXAttribute>& aAttrs,
                TMPXOpenMode aMode=EMPXOpenDefault);

    /**
    *  From MMPXCollection
    *  Opens the collection at a specific level
    *
    *  Calls back MMPXCollectionObserver::HandleOpenL() with CMPXMedia object
    *  with ID KMPXMediaIdContainer, i.e.contains other media objects which will
    *  contain the attribute values specified by aAttrs
    *
    *  @param aPath, the path of the collection
    *  @param aAttrs, attributes requested.
    *  @param aMode, type of open mode required
    */
    void OpenL(const CMPXCollectionPath& aPath,
    		   const TArray<TMPXAttribute>& aAttrs,
               TMPXOpenMode aMode=EMPXOpenDefault);

    /**
    *  From MMPXCollection
    *  Opens the collection with a list of implementation uids to be matched.
    *  if current context matches the criteria, it will return existing browsing
    *  media; otherwise it will be back to root level and only plug-ins which
    *  match all provided uids will be returned, in priority order.
    *
    *  Calls back MMPXCollectionObserver::HandleOpenL() with CMPXMedia object
    *  with ID KMPXMediaIdContainer. Returned plugins will be sorted by plugin
    *  priority if mulitple plugins support aUids.
    *
    *  @param aUids, array of UIDs used to select collection plugins based on
    *  supported uids in plugin resource file.
    *  @param aMode, open mode
    */
    void OpenL(const TArray<TUid>& aUids,
    		   TMPXOpenMode aMode=EMPXOpenDefault);

    /**
    *  From MMPXCollection
    *  Opens the collection with an uid to be matched.
    *  if current context matches the criteria, it will return existing browsing
    *  media; otherwise it will be back to root level and only plug-ins which
    *  match the uid will be returned, in priority order.
    *
    *  Calls back MMPXCollectionObserver::HandleOpenL() with CMPXMedia object
    *  with ID KMPXMediaIdContainer. Returned plugins will be sorted by plugin
    *  priority if mulitple plugins support the uid.
    *
    *  @param aUid, single UID used to select a collection
    *  @param aMode, open mode
    */
    void OpenL(const TUid& aUid,
    		   TMPXOpenMode aMode=EMPXOpenDefault);

    /**
    *  From MMPXCollection
    *  Apply a filter to collection browsing; all subsequent calls
    *  to OpenL() will have this filter applied.
    *
    *  @param aFilter, the filter to apply, or NULL to remove current
    *  filter
    */
    void SetFilterL(CMPXFilter* aFilter);

    /**
    *  From MMPXCollection
    *  Current filter that is applied to collection browsing, i.e. results
    *  returned through MMPXCollectionObserver::HandleOpenL() callback from
    *  OpenL()
    *
    *  @return filter applied to browsing, or NULL if no filter applied
    */
    CMPXFilter* FilterL();

    /**
    *  From MMPXCollection
    *  Returns current collection plugin implementation UID
    *
    *  @return UID of the collection
    */
    TUid UidL() const;

    /**
    *  From MMPXCollection
    *  The path of the collection in its current state
    *
    *  @return the path of the collection
    */
    CMPXCollectionPath* PathL();

    /**
    *  From MMPXCollection
    *  Navigates back to the container of the current items
    *  Calls back MMPXCollectionObserver::HandleOpenL()
    */
    void BackL();

    /**
    *  From MMPXCollection
    *  Is this path on a 'remote' collection
    *
    *  @aParam aPath, the collection path
    *  @return ETrue if is remote collection, otherwise EFalse
    */
    TBool IsRemote(const CMPXCollectionPath& aPath);

    /**
    *  From MMPXCollection
    *  Stops any async operations that are currently under way
    */
    void CancelRequest();

    /**
    *  From MMPXCollection
    *  Adds item(s) to the collection
    *
    *  @param aNewProperties, Properties of the item
    */
    void AddL(const CMPXMedia& aNewProperties);

    /**
    *  From MMPXCollection
    *  Remove an item (or items under a group) from the collection
    *
    *  @param aPath, item(s) to remove
    *  @param aObs, observer callback for items deleted (Optional)
    */
    void RemoveL(const CMPXCollectionPath& aPath,
                 MMPXCollectionRemoveObserver* aObs = NULL );

        /**
    *  From MMPXCollection
    *  Removes item(s) to the collection
    *
    *  @param aProperties, Properties of the item
    */
    void RemoveL(const CMPXMedia& aProperties);

    /**
    *  From MMPXCollection
    *
    *  Sets/updates the media for the item
    *  Callback via EMediaChanged message if currently opened
    *
    *  @param aMedia, updated item
    *
    */
    void SetSyncL(const CMPXMedia& aMedia);

    /**
    *  From MMPXCollection
    *
    *  Sets/updates the media for the item, Asynchronous
    *  Callback via HandleCollectionMessage, AsyncOp complete
    *
    *  @param aMedia, new value
    *
    */
    void SetL(const CMPXMedia& aMedia);

    /**
    * Find a list of media properties based on a search criteria
    * The types of supported "queries" are plugin dependent
    *
    * @param aMedia, criteria to search on
    * @param aAttrs, attributes to return
    * @param aObs, observer for find callback
    * Callback via MMPXCollectionFindObserver::HandleFindL();
    */
    void FindAllL(const CMPXMedia& aMedia,
                  const TArray<TMPXAttribute>& aAttrs,
                  MMPXCollectionFindObserver& aObs);

    /**
    * Find a list of media properties based on a search criteria
    * The types of supported "queries" are plugin dependent
    * This is a SYNCHRONOUS METHOD, use only if necessary.
    * @param aMedia, criteria to search on
    * @param aAttrs, attributes to return
    */
    CMPXMedia* FindAllL(const CMPXMedia& aMedia,
                        const TArray<TMPXAttribute>& aAttrs);

    /**
    *  From MMPXCollection
    *  Retrieve media for the item specified in the path
    *  Note: if selection is set in aPath, HandleMedia will return an array of
    *        media of current selected items.
    *        if no selection is set in aPath, HandleMedia will return media
    *        properities of current item.
    *
    *  @param aPath, the path of the collection
    *  @param aAttrs, attributes requested.
    *  @aParam aSpecs, specifications for attributes
    *  @param aFilter, filter to apply
    *
    *  Calls back MMPXCollectionObserver::HandleMediaL()
    */
    void MediaL(const CMPXCollectionPath& aPath,
                const TArray<TMPXAttribute>& aAttrs,
                CMPXAttributeSpecs* aSpecs=NULL,
                CMPXFilter* aFilter=NULL);

    /**
    * From MMPXCollection
    * Broadcasts an event to all observers
    * @param aMsg event to broadcast
    * @param aData data to accompany the event
    */
    void NotifyL( TMPXCollectionBroadCastMsg aMsg, TInt aData );

    /**
    * From MMPXCollection
    * Send a Command to the collection server
    * aCmd, command to handle
    * aData, some data about event (event specific, optional)
    */
    void CommandL(TMPXCollectionCommand aCmd, TInt aData = 0);

    /**
    * From MMPXCollection
    *  Send a command to the collection server
    *
    *  @param aCmd, command to handle
    */
    void CommandL(CMPXCommand& aCmd);

    /**
    * From MMPXCollection
    * Retrieves the set of supported file types
    * @param aArray Array to fill with the data
    */
    void GetSupportedTypesL( RPointerArray<CMPXCollectionType>& aArray );

    /**
    * From MMPXCollection
    * Retrieves the capabilities for the current collection context
    * @arg aCapability, bitmask of the capabilities supported.
    */
    void GetSupportedCapabilitiesL(TCollectionCapability& aCapability);

    /**
    * From MMPXCollection
    * Retrieves the real collection UID based on a predefined UID
    * @param aCollection, UID for lookup, defined in "mpxcollectionframeworkdefs.h"
    * @return TUid containing the real implementation UID
    */
    TUid CollectionIDL(TUid& aCollection);

    /**
    * From MMPXCollection
    * Adds a message subscription for this client.
    * @param aSubscription subscription to be added
    */
    void AddSubscriptionL(const CMPXSubscription& aSubscription);

    /**
    * From MMPXCollection
    * Removes a message subscription for this client.
    * @param aSubscription subscription to be removed.
    */
    void RemoveSubscriptionL(const CMPXSubscription& aSubscription);

    /**
    * From MMPXCollection
    * Removes all message subscriptions for this client.
    */
    void ClearSubscriptionsL();

    /**
    * From MMPXMessageObserver
    * Message received
    * @param aMsgData message data
    * @param aError error code
    */
    void MessageReceived(TInt aMsgData, TInt aError);

    /**
    * From CActive
    * Handles an active object's request completion event
    */
    void RunL();

    /**
    * From CActive
    * Implements cancellation of an outstanding request.
    */
   void DoCancel();

    /**
    * From CActive
    * Handles a leave occurring in the request completion event handler RunL()
    *
    * @param aError error code
    */
    TInt RunError(TInt aError);

private:

    /**
    *  Add a request to the task queue and run the next queue if no outstanding
    *  task
    *
    *  @param aFunction function code
    *  @param aObs, observer to callback asynchronously
    *  @param aParamData data
    *  @param aBuf, extra data in buffer, ownership transferred.
    *  @param aPtr, pointer to a object
    *  @param aAlivePtr1, object to keep alive for a task
                         ownership transferred
    *  @param aAlivePtr2, same as aAlivePtr1
    */
    void AddRequestL(TMPXCollectionServerOp aFunction,
                     TAny* aObs,
                     TInt aParamData=0,
                     CBufBase* aBuf=NULL,
                     TAny* aPtr=NULL,
                     CBase* aAlivePtr1=NULL,
                     CBase* aAlivePtr2=NULL);

    /**
    *  Send next request to server
    */
    void ExecuteNextRequest();

    /**
    *  Handle message from message queue
    *  @param aMsgData message data
    *  @param aError error code
    */
    void HandleMessageL(TInt aMsgData, TInt aError);

    /**
     * Handles error in RunL
     *
     * @param aError error code
     */
    void HandleRunErrorL(TInt aError);

#ifdef _ENABLE_GUARD_TIMER
    /**
     *  Gaurd timer callback
     *
     *  @param aPtr pointer the this
     */
    static TInt GuardTimerCallback(TAny* aPtr);
#endif

private:
    MMPXCollectionObserver* iObserver;
    CMPXMessageMonitor* iMsgMonitor;
    CMPXTaskQueue* iTaskQueue;
    RMPXSession iMcs;
    CMPXMedia* iCurrentEntries;

    CBufBase* iBuffer;
    CArrayFixBase* iArray;
    TPckgBuf<TInt> iSizePckg;
    TPckgBuf<TInt> iSelectionPckg;
    TPckgBuf<TInt> iCompletePckg;
    TPckgBuf<TInt> iPropertiesSizePckg;
    TInt iSelection;
    TBool iCallbackOngoing; // is client processing callback?
    // Keep alive pointers on global heap
    CMPXMedia* iMedia;
    CMPXMedia* iMediaOnError; // media object while handling error
#ifdef _ENABLE_GUARD_TIMER
    CPeriodic* iGuardTimer; //guard timer for async request
#endif
    };

#endif // CMPXCOLLECTIONUTILITY_H