upnpharvester/cdssync/cdssynclib/inc/cdssyncimplsql.h
author Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
Mon, 04 Oct 2010 00:34:14 +0300
changeset 35 f37b1259bd7b
parent 0 7f85d04be362
permissions -rw-r--r--
Revision: 201037 Kit: 201039

/*
* Copyright (c) 2008 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:      Cds Sync Implementation Header
*
*/







#ifndef __CDSSYNCIMPL_H__
#define __CDSSYNCIMPL_H__

#include <e32cons.h>
#include <e32base.h> 
#include <f32file.h>
#include "cdssync.h"
#include <xml/parser.h>
#include <xml/contenthandler.h>

// Forward declarations
class CCdsSyncSqlAo;
class MCmSqlMain;
class CCmSqlPropertyItem;
class CCmSqlGenericItem;
class CCmSqlBaseItem;

typedef RPointerArray<CCmSqlPropertyItem> CCmSqlPropertyItemArray;

using namespace Xml;

/**
 *  CItemResource class definition
 *
 *  @lib cdssync.lib
 *  @since S60 5.1
 */
NONSHARABLE_CLASS( CItemResource ) : public CBase 
{
public:
    
    /**
     * Two-phased constructor.
     */
    static CItemResource* NewLC();
   
    /**
     * Two-phased constructor.
     */    
    static CItemResource* NewL();
    
    /**
     * Destructor
     */
    virtual ~CItemResource();
    
private:
    /**
     * Performs the first phase of two phase construction.
     */
    CItemResource();

    /**
     * Performs the second phase construction.
     */    
    void ConstructL();

public:
    /**
     * Track duration
     */
    HBufC8* iDuration;   // owned
    /**
     * Track bitrate
     */    
    HBufC8* iBitrate;    // owned
    /**
     * File size
     */
    HBufC8* iSize;       // owned
    /**
     * Item resolution
     */
    HBufC8* iResolution; // owned
    /**
     * Item uri
     */
    HBufC8* iUri;        // owned
    /**
     * Item protocol
     */
    HBufC8* iProtocol;   // owned
};


/**
 * CCdsSyncImpl class definition
 *
 * @lib cdssync.lib
 *
 * @since S60 5.1
 */    
class CCdsSyncImpl : public CActive, 
                     public MContentHandler 
      {

private:

    // Syncronization status
    enum TCdsSyncStatus
        {
        ECdsSyncIdle,
        ECdsSyncInitializing,
        ECdsSyncReadyToParse,
        ECdsSyncParsing,
        ECdsSyncFinalizing
        };

public:

    /**
     * Two-phased constructor.
     */
    static CCdsSyncImpl* NewLC();

    /**
     * Two-phased constructor.
     */    
    static CCdsSyncImpl* NewL();
    
    /**
     * Destructor
     */    
    ~CCdsSyncImpl();

public: // new functions    

    /**
     * Initializes data
     *
     * @Since S60 5.1
     * @param aSourceDataArray, source data
     * @param aDeviceId, device id where data is retrieved
     * @param aObserver, process observer
     * @param aAddGranularity, data granularity
     */    
    void InitL( RPointerArray<HBufC8>& aSourceDataArray,
                         const TInt& aDeviceId, 
                         MCdsSyncObserver& aObserver,
                         TInt aAddGranularity);

    /**
     * Notifies when data is added
     *
     * @Since S60 5.1
     * @param aSourceDataComplete, indicates if all source data is added
     */
    void NotifySourceDataAddedL( 
        TBool aSourceDataComplete = EFalse );

    /**
     * Cancels operation and cleans data
     *
     * @Since S60 5.1     
     */
    void ResetL();
    
    /**
     * Called when operation is completed
     *
     * @Since S60 5.1
     * @param aErrCode, error code
     */    
    void OperationsCompleteL( TInt aErrCode );

    /**
     * Notifies observer about progress
     *
     * @Since S60 5.1
     * @param aItemCount, processed items
     */
    void ProgressL( TInt aItemCount );

    /**
     * Returns the chunk count to be processed including current chunk
     *
     * @Since S60 5.1
     * @return TInt, chunk count
     */    
    TInt ChunkCount();
    
    /**
     * Returns successfully processed item count. 
     *
     * @since S60 5.1
     * @return TInt, count of items that has been processed successfully.
     */
    TInt ProcessedItemCount();
    
    /**
     * Sets search index to cds sync
     *
     * @since S60 5.1
     * @param aSearchIndex, search index
     */    
    void SetSearchIndex( const TInt aSearchIndex );    
    
    /**
     * Chunk complete callback
     *
     * @since S60 5.1
     */    
    void ChunkCompleteL();

// From base class MContentHandler        

    /**
     * From MContentHandler
     * See base class definition
     */     
    void OnStartDocumentL( const RDocumentParameters& aDocParam, 
                           TInt aErrorCode );
    /**
     * From MContentHandler
     * See base class definition
     */
    void OnEndDocumentL( TInt aErrorCode );
    
    /**
     * From MContentHandler
     * See base class definition
     */
    void OnStartElementL( const RTagInfo& aElement, 
                          const RAttributeArray& aAttributes, 
                          TInt aErrorCode );
    
    /**
     * From MContentHandler
     * See base class definition
     */
    void OnEndElementL( const RTagInfo& aElement, TInt aErrorCode );

    /**
     * From MContentHandler
     * See base class definition
     */
    void OnContentL( const TDesC8& aBytes, TInt aErrorCode );
    
    /**
     * From MContentHandler
     * See base class definition
     */
    void OnStartPrefixMappingL( const RString& aPrefix, 
                                const RString& aUri, 
                                TInt aErrorCode);
    
    /**
     * From MContentHandler
     * See base class definition
     */
    void OnEndPrefixMappingL( const RString& aPrefix, TInt aErrorCode );

    /**
     * From MContentHandler
     * See base class definition
     */
    void OnIgnorableWhiteSpaceL( const TDesC8& aBytes, TInt aErrorCode );

    /**
     * From MContentHandler
     * See base class definition
     */
    void OnSkippedEntityL( const RString& aName, TInt aErrorCode );

    /**
     * From MContentHandler
     * See base class definition
     */
    void OnProcessingInstructionL( const TDesC8& aTarget, 
                                   const TDesC8& aData, 
                                   TInt aErrorCode);
    
    /**
     * From MContentHandler
     * See base class definition
     */
    void OnError( TInt aErrorCode );

    /**
     * From MContentHandler
     * See base class definition
     */
    TAny* GetExtendedInterface( const TInt32 aUid );
    
// From base class CActive

    /**
     * From CActive
     * See base class definition
     */
    void RunL();

    /**
     * From CActive
     * See base class definition
     */    
    void DoCancel();
    
private:

    /**
     * Performs the first phase of two phase construction.
     */    
    CCdsSyncImpl();

    /**
     * Performs the second phase construction.
     */        
    void ConstructL();

    /**
     * Parses profile id
     *
     * @since S60 5.1
     * @param aItem, item data
     * @param aRes, item resource
     */
    void ParseProfileIdL( CCmSqlGenericItem& aItem,
                          const CItemResource& aRes ) const;
        
    /**
     * Starts background parsing
     *
     * @since S60 5.1
     */
    TInt DoBackgroundParseL();

    /**
     * Background parsing callback
     *
     * @since S60 5.1
     * @param aCdsSync, observer
     */
    static TInt BackgroundParseL( TAny *aCdsSync );

    /**
     * Finds attributes
     *
     * @since S60 5.1
     * @param aName, local name
     * @param aPref, prefix
     * @param aAttributes, attribute array
     */
    TInt FindAttribute( const TDesC8& aName, 
                        const TDesC8& aPref, 
                        const RAttributeArray& aAttributes ) const;
    
    /**
     * Parses resolution information
     *
     * @since S60 5.1
     * @param aDes, buffer to be parsed
     * @param aWidth, image widht
     * @param aHeight, image height
     */
    void ParseResolution( const TDesC8& aDes,
                          TUint& aWidth,
                          TUint& aHeight ) const;
    
    /**
     * Parses value from descriptor
     *
     * @since S60 5.1
     * @param aDes, buffer to be parsed
     * @return TUInt, parsed value     
     */
    TUint ParseUint( const TDesC8& aDes ) const;

    /**
     * Parses value from descriptor
     *
     * @since S60 5.1
     * @param aDes, buffer to be parsed
     * @return TInt64, parsed value     
     */
    TInt64 ParseInt64( const TDesC8& aDes ) const;

    /**
     * Parses track duration
     *
     * @since S60 5.1
     * @param aDes, buffer to be parsed
     * @return TReal, duration
     */
    TReal ParseDuration( const TDesC8& aDes ) const;

    /**
     * Parses time
     *
     * @since S60 5.1
     * @param aDes, buffer to be parsed
     * @return TTime, parsed time
     */    
    TTime ParseTime( const TDesC8& aDes ) const;

    /**
     * Calculates hash value
     *
     * @since S60 5.1  
     * @return HBufC, hash value
     */
    HBufC8* CalculateHashL() const;

    /**
     * Append escpace characters to hash value
     *
     * @since S60 5.1
     * @param aHash, hash value
     * @return HBufC, hash value with escape charachters
     */
    HBufC* EscapeHashLC( const TDesC8& aHash ) const;

    /**
     * Gets property ID
     *
     * @since S60 5.1
     * @param aMetadataIndex, index for metadata type table
     * @param aValue, property name
     * @return TInt64, property id
     */
    TInt64 GetPropertyIdL( TInt aMetadataIndex, const TDesC8& aValue ) const;

    /**
     * Clears item data
     *
     * @since S60 5.1
     */
    void CleanItemData();

    /**
     * Removes unchanged items
     *
     * @since S60 5.1
     */
    void RemoveUnchangedItems();

    /**
     * Parses uri
     *
     * @since S60 5.1
     */
    void ParseUri();
     
private:

    /**
     * Cds Sync observer
     */
    MCdsSyncObserver*   iObserver;                          // not owned
    /**
     * Parser
     */
    CParser*            iParser;                            // owned
    /**
     * Metadata database
     */
    MCmSqlMain*         iMetadataDb;                        // owned
    /**
     * Active object for low priority processing
     */
    CIdle*              iBackground;                        // owned
    /**
     * Cds Sync active object
     */
    CCdsSyncSqlAo*      iSqlAo;                             // owned
    /**
     * Data chuck
     */
    HBufC8* iCurrentDocument;                               // owned
    /**
     * Sync status
     */
    TCdsSyncStatus    iState;
    /**
     * Data buffer
     */
    HBufC8* iCurrentContent;                                // owned
    /**
     * Item id
     */    
    HBufC8* iItemId;                                        // owned
    /**
     * Artist name
     */
    HBufC8* iArtist;                                        // owned
    /**
     * Album name
     */
    HBufC8* iAlbum;                                         // owned
    /**
     * Title
     */
    HBufC8* iTitle;                                         // owned
    /**
     * Album class
     */
    HBufC8* iClass;                                         // owned
    /**
     * Music genre
     */    
    HBufC8* iGenre;                                         // owned
    /**
     * Album data
     */
    HBufC8* iDate;                                          // owned
    /**
     * Description field
     */
    HBufC8* iDescription;                                   // owned
    /**
     * Album art
     */
    HBufC8* iAlbumArtUri;                                   // owned
    /**
     * Item resource array
     */
    RPointerArray<CItemResource> iResources;                // items owned
    /**
     * Flag for indicating that source data is ready
     */
    TBool iSourceDataComplete;
    /**
     * Datachunk index
     */
    TInt iChunkIndex;
    /**
     * Amount of unchanged items
     */
    TInt iUnchangedItemCount;
    /**
     * Hash order
     */    
    TLinearOrder<CCmSqlBaseItem> iHashOrder;
    /**
     * Name order
     */
    TLinearOrder<CCmSqlPropertyItem> iNameOrder;
    /**
     * Source data array
     */
    RPointerArray<HBufC8>* iSourceDataArray;                // not owned
    /**
     * Name array
     */
    RPointerArray<CCmSqlPropertyItemArray> iNames;          // items owned
    /**
     * Array of items to add
     */
    RPointerArray<CCmSqlGenericItem> iItemsToAdd;           // items owned
    /**
     * Array of items in the database
     */
    RPointerArray<CCmSqlBaseItem> iItemsInDb;               // items owned
    /**
     * File server session
     */
    RFs iFs;
    /**
     * Search index
     */    
    TInt iSearchIndex;
    /**
     * Count of processed items
     */ 
    TInt iProcessedItems;
#ifdef _DEBUG
    /**
     * Hash time
     */ 
    TInt64 iHashTime;
#endif // _DEBUG
    };
#endif // __CDSSYNCIMPL_H__