upnpmediaserver/contentdirectoryservice/inc/upnpcontentdirectorydb.h
changeset 0 7f85d04be362
child 25 52826dcbed74
equal deleted inserted replaced
-1:000000000000 0:7f85d04be362
       
     1 /** @file
       
     2 * Copyright (c) 2005-2006 Nokia Corporation and/or its subsidiary(-ies). 
       
     3 * All rights reserved.
       
     4 * This component and the accompanying materials are made available
       
     5 * under the terms of "Eclipse Public License v1.0"
       
     6 * which accompanies  this distribution, and is available 
       
     7 * at the URL "http://www.eclipse.org/legal/epl-v10.html".
       
     8 *
       
     9 * Initial Contributors:
       
    10 * Nokia Corporation - initial contribution.
       
    11 *
       
    12 * Contributors:
       
    13 *
       
    14 * Description:  Database for MediaServer
       
    15 *
       
    16 */
       
    17 
       
    18 
       
    19 
       
    20 #ifndef C_CUPNPCONTENTDIRECTORYDB_H
       
    21 #define C_CUPNPCONTENTDIRECTORYDB_H
       
    22 
       
    23 //  INCLUDES
       
    24 #include <e32base.h>
       
    25 #include <d32dbms.h>
       
    26 #include <s32file.h>
       
    27 #include <flogger.h>
       
    28 #include <upnperrors.h>
       
    29 #include <xmlengdom.h>
       
    30 
       
    31 
       
    32 // CLASS DECLARATION
       
    33 class CUpnpElementBean;
       
    34 class CUpnpFilterElement;
       
    35 class CUpnpAttributeBean;
       
    36 class CUpnpObjectBean;
       
    37 class CUpnpDlnaProtocolInfo;
       
    38 class CUpnpShareMapBean;
       
    39 class CUpnpResourcesBean;
       
    40 class CUpnpMetadataStorage;
       
    41 
       
    42 
       
    43 
       
    44 /**
       
    45 *  Database for AVContentDirectory.
       
    46 *  Implements a database which is used to store descriptors of shared content.
       
    47 *
       
    48 *  @lib ContentDirectoryDb.lib
       
    49 *  @since Series 60 3.0
       
    50 */
       
    51 class CUpnpContentDirectoryDb : public CBase
       
    52 {
       
    53  public:  // Constructors and destructor
       
    54  
       
    55     /**
       
    56     * Two-phased constructor.
       
    57     */
       
    58     static CUpnpContentDirectoryDb* NewLC(CUpnpMetadataStorage* aMetadataStorage);
       
    59     static CUpnpContentDirectoryDb* NewL(CUpnpMetadataStorage* aMetadataStorage);
       
    60 
       
    61     /**
       
    62     * Destructor
       
    63     */
       
    64     ~CUpnpContentDirectoryDb();
       
    65     
       
    66  public: // New functions
       
    67     
       
    68     /**
       
    69     * Checks if object with the given id exists, is a container and its 'restricted' attribute has value of 'false'
       
    70     * @since Series S60 3.0
       
    71     * @param aObjId id of the object to be checked
       
    72     * @return returns EUpnpOk if object with the given id exists in database and is a "non restricted conainer"
       
    73     */
       
    74     TUpnpErrorCode CheckObjectRestrictionL(TInt aObjId);
       
    75 
       
    76     /**
       
    77     * Inserts object into database 
       
    78     * @since Series S60 3.0
       
    79     * @param aFragment RDocuemnt of the document to be added to database
       
    80     * @param aId id of the object  
       
    81     * @return EUpnpOk, if successful; Otherwise, one of the other Upnp error codes.
       
    82     */
       
    83     TUpnpErrorCode InsertObjectL( RXmlEngDocument& aFragment, TInt aContainer, TInt* aId);
       
    84     
       
    85     /**
       
    86     * Function returns DIDL-Lite XML fragment with metadata for requested object.
       
    87     * IMPORTANT: 1. Caller takes responsibility for returned document and is 
       
    88     *               obliged to close it.
       
    89     *        2. The root element of the document is <DIDL-Lite> element and
       
    90     *               the object's element is its direct, onluy child.
       
    91     * @param aObjectID id of requested object.
       
    92     * @param aDoc handler to document containing object's metadata.
       
    93     * @return EUpnpOk, if successful; Otherwise, one of the other Upnp error codes.
       
    94     */
       
    95     TUpnpErrorCode GetObjectL( TInt aObjectID, RXmlEngDocument& aDoc, 
       
    96                                const TDesC8& aFilterString);
       
    97                     
       
    98     /**
       
    99     * Gets id of reffered object 
       
   100     * @since Series S60 3.0
       
   101     * @param aObjectId object id
       
   102     * @return reffered object id.
       
   103     */
       
   104     TInt ReferedObjectIdL( TInt aObjectId );
       
   105     
       
   106     /**
       
   107     * Gets object list
       
   108     * @since Series S60 3.1
       
   109     * @param aParentId
       
   110     * @parem aList
       
   111     * @return upnperrorcode descriping situation
       
   112     */
       
   113     TUpnpErrorCode GetObjectListL(TInt aParentId, RArray<TInt>& aList);
       
   114     
       
   115     /**
       
   116     * Deletes object from database
       
   117     * @since Series S60 3.0
       
   118     * @param aObjId id of the object to be deleted
       
   119     * @return EUpnpOk, if successful; Otherwise, one of the other Upnp error codes.
       
   120     */
       
   121     TUpnpErrorCode DeleteObjectL(TInt aObjId,RArray<TInt>& aRefList, TBool aDeleteResource=ETrue);
       
   122     
       
   123     /**
       
   124     * Updates the metadata of the object with specified id
       
   125     * @since Series S60 3.0
       
   126     * @param aObjId id of the object to be updated
       
   127     * @param  aFragment XML DOM tree with the updated object's metadata
       
   128     * @return EUpnpOk, if successful; Otherwise, one of the other Upnp error codes.
       
   129     */
       
   130     TUpnpErrorCode UpdateObjectL(TInt aObjId, RXmlEngDocument& aFragment);
       
   131     
       
   132 
       
   133     /**
       
   134     * Deletes the res elements with the specified value.
       
   135     * @since Series S60 3.0
       
   136     * @param aResVal value of the res element which is to be deleted
       
   137     * @param aTumbailResVal value of the thumbail res element which is to be deleted
       
   138     */
       
   139     void DeleteResourceL(const TDesC8& aResVal, RArray<TInt>& aContIds);
       
   140 
       
   141     /**
       
   142     * Gets object by its attribute value.
       
   143     * @since Series S60 3.0
       
   144     * @param aDoc on return, it contains the object's data
       
   145     * @param aObjId on, return it contains the object's id
       
   146     * @param aAttrName attribute's name
       
   147     * @param aAttrVal attribute's value
       
   148     * @return EUpnpOk, if successful; Otherwise, one of the other Upnp error codes.
       
   149     */
       
   150     TUpnpErrorCode GetObjectByAttrL(RXmlEngDocument& aDoc, TInt* aObjId, 
       
   151                                     const TDesC8& aAttrName, const TDesC8& aAttrVal);   
       
   152 
       
   153     /**
       
   154     * Checks the restrictions of the parent object of the given object.
       
   155     * @since Series S60 3.0
       
   156     * @param aObjId object's id
       
   157     * @return returns EUpnpOk if object with the given id exists in database and is a "non restricted conainer"    
       
   158     */
       
   159     TUpnpErrorCode CheckParentRestrictionL(TInt aObjId);
       
   160 
       
   161     /**
       
   162     * Gets the object id by its attribute value.
       
   163     * @since Series S60 3.0
       
   164     * @param aAttrName attribute's name
       
   165     * @param aAttrVal attribute's value
       
   166     * @return object's id
       
   167     */
       
   168     TInt GetObjIdByAttrL(const TDesC8& aAttrName, const TDesC8& aAttrVal);
       
   169 
       
   170     /**
       
   171     * Gets the object id by its attribute value. Uses LIKE operator for comparison
       
   172     * @since Series S60 3.0
       
   173     * @param aAttrName attribute's name
       
   174     * @param aAttrVal attribute's value
       
   175     * @return object's id
       
   176     */
       
   177     TInt GetObjIdByAttrLikeL(const TDesC8& aAttrName, const TDesC8& aAttrVal);
       
   178 
       
   179 
       
   180     /**
       
   181     * Prepares a new RXmlEngDocument with DIDL-Lite element 
       
   182     * @since Series S60 3.0
       
   183     * @return Returns just created document
       
   184     */
       
   185     RXmlEngDocument PrepareDidlDocumentL();
       
   186     
       
   187     
       
   188     /**
       
   189     * Find protocolInfo by contentUri (Not by importUri).
       
   190     * @param aContentUri uri to be searched in database (Value of resource).
       
   191     * @param aProtocolInfo ProtocolInfo related to resorce which has been founded. Ownership is transfered to the caller.
       
   192     * @return KErrNone if successful, otherwise another of the system-wide error codes 
       
   193     */
       
   194     TInt GetProtocolInfoL(const TDesC8& aContentUri, CUpnpDlnaProtocolInfo*& aProtocolInfo); // virtual
       
   195 
       
   196     
       
   197     /**
       
   198     * Gets object list
       
   199     * @since Series S60 3.1
       
   200     * @param aIds
       
   201     * @param aFilter
       
   202     * @param aObjs
       
   203     * @return upnperrorcode descriping situation
       
   204     */
       
   205     void GetObjectListL(const RArray<TInt>& aIds, const TDesC8& aFilter, RArray<RXmlEngDocument>& aObjs);
       
   206     
       
   207     /**
       
   208     *
       
   209     * @since Series S60 3.1
       
   210     * @param aObjId
       
   211     * @return boolean whether can be nested
       
   212     */
       
   213     TBool CanBeNestedL(TInt aObjId);
       
   214     
       
   215     /**
       
   216     *
       
   217     * @since Series S60 3.1
       
   218     * @param aResBean
       
   219     */
       
   220     void AddResourceL(CUpnpResourcesBean* aResBean, TInt aObjId);
       
   221     
       
   222     /**
       
   223     * Deletes resource
       
   224     * @since Series S60 3.1
       
   225     * @param aResId
       
   226 	* @param aDeleteFile
       
   227     */
       
   228     void DeleteResourceByResIdL(TInt64 aResId, TBool aDeleteFile = ETrue);
       
   229     
       
   230     /**
       
   231     * Deletes resource
       
   232     * @since Series S60 3.1
       
   233     * @param aResId
       
   234 	* @param aDeleteFile
       
   235     */
       
   236     void DeleteResourceByObjIdL(TInt aObjId, TBool aDeleteFile = ETrue);
       
   237     
       
   238     /**
       
   239     *
       
   240     * @since Series S60 3.1
       
   241     * @param aOldDir
       
   242     */
       
   243     void NewMediaDirectoryL(const TDesC& aOldDir);
       
   244     
       
   245     /**
       
   246     * Gets resource
       
   247     * @since Series S60 3.1
       
   248     * @param aResId
       
   249     * @return pointer to CUpnpResourceBean
       
   250     */
       
   251     CUpnpResourcesBean* GetResourceL(TInt64 aResId);
       
   252     
       
   253     /**
       
   254     * Gets attribute
       
   255     * @since Series S60 3.1
       
   256     * @param aElmId
       
   257     * @param aAttrName
       
   258     * @param aAttrVal
       
   259     * @return pointer to CUpnpAttributesBean
       
   260     */
       
   261     CUpnpAttributeBean* GetAttrByNameL(TInt aElmId, const TDesC8& aAttrName, HBufC8*& aAttrVal);
       
   262     
       
   263     /**
       
   264     * Gets attribute
       
   265     * @since Series S60 3.1
       
   266     * @param aAttrName
       
   267     * @param aAttrVal
       
   268     * @return pointer to CUpnpAttributeBean
       
   269     */
       
   270     CUpnpAttributeBean* GetAttrByValueL(const TDesC8& aAttrName, const TDesC8& aAttrVal);
       
   271     
       
   272     /**
       
   273     * Gest protocol info
       
   274     * @since Series S60 3,1
       
   275     * @param aImportUri
       
   276     * @return descriptor pointer
       
   277     */
       
   278     HBufC8* GetProtocolInfoByImportUriL(const TDesC8& aImportUri);
       
   279     
       
   280     
       
   281     /**
       
   282     * Getter
       
   283     * @since Series S60 3.1
       
   284     * @return TInt
       
   285     */
       
   286     TInt GetKeyForUriL();
       
   287     
       
   288     /**
       
   289     * Gets first object ID by element value
       
   290     * @param aElmName - element name
       
   291     * @param aElmValue - element value
       
   292     * @return object ID
       
   293     */
       
   294     TInt GetObjectIdByElementValueLikeL(const TDesC8& aElmName, const TDesC8& aElmValue);
       
   295 
       
   296     /**
       
   297     * Gets the parent object's id of the object with given id.
       
   298     * @since Series S60 3.1
       
   299     * @param aObjectId child object id
       
   300     * @return parentid
       
   301     */
       
   302     TInt GetParentIdL(TInt aObjectId);
       
   303     /**
       
   304     * Gets the next object's id .
       
   305     * @since Series S60 3.1
       
   306     * @return id
       
   307     */
       
   308     TInt GetObjectIdL();
       
   309     /**
       
   310     * Gets the next object's id .
       
   311     * @since Series S60 3.1
       
   312     * @return id
       
   313     */
       
   314     HBufC8* GetObjectTitleL(TInt aId);
       
   315 
       
   316    /**
       
   317     * Checks if database have propper columns in each table.
       
   318     * If not it leaves with KErrCorrupt.
       
   319     * @since Series S60 3.2
       
   320     */
       
   321     void CheckDatabaseL();  
       
   322     
       
   323    /**
       
   324     * Handles DB error
       
   325     * Tries to recover, if fails tries to recreate
       
   326     * @since Series S60 3.2
       
   327     * @return TInt - KErrNone if succed
       
   328     */
       
   329     TInt HandleDbError( TInt aError );
       
   330 
       
   331     /**
       
   332     * Recreates the database file.
       
   333     * @since Series S60 3.1
       
   334     */
       
   335     TInt RecreateDatabaseFile();
       
   336     
       
   337     /**
       
   338     * Returns DB creation status
       
   339     * @since Series S60 3.2
       
   340     * @return TBool
       
   341     */
       
   342     TBool IsDbCreated();
       
   343 
       
   344  private:
       
   345     
       
   346     /**
       
   347     * Getter
       
   348     * @since Series S60 3.1
       
   349     * @param aObjId
       
   350     * @return pointer to CUpnpObjectBean
       
   351     */
       
   352     CUpnpObjectBean* GetObjBeanLC(TInt aObjId);
       
   353     
       
   354     /**
       
   355     * Gets object
       
   356     * @since Series S60 3.1
       
   357     * @param aIns
       
   358     * @param AresVal
       
   359     */
       
   360     void GetObjectsByResourceL(RArray<TInt>& aIds, const TDesC& aResVal);
       
   361        
       
   362       
       
   363     /**
       
   364     * Gets element
       
   365     * @since Series S60 3.1
       
   366     * @param aElmName
       
   367     * @param ElmValue
       
   368     * @return TInt
       
   369     */
       
   370     TInt GetElmIdByNameAndValL(const TDesC& aElmName, const TDesC& aElmValue);
       
   371     
       
   372     /**
       
   373     * Gets attribute
       
   374     * @since Series S60 3.1
       
   375     * @param aElmId
       
   376     * @param aAttrName
       
   377     * @param aAttrValue
       
   378     */
       
   379     void GetAttrValueByNameL(TInt aElmId, const TDesC8& aAttrName, HBufC8*& aAttrVal);
       
   380 
       
   381     /**
       
   382     * Performs resource deletion of the object being destroyed
       
   383     * @since Series S60 3.0
       
   384     * @param aObjId aObjId id of the object being destroyed
       
   385     * @param aObjId aCd pointer to the ContentDirectory object - it provides a function which deletes
       
   386     *                  a file from the private directory
       
   387     */
       
   388     void DeleteResourcesL(TInt aObjId);
       
   389 
       
   390     /**
       
   391     * Performs the DeleteResource operation. 
       
   392     * Deletes each res element with the value of aResVal and corresponding thumnail res elements
       
   393     * @since Series S60 3.0
       
   394     * @param aResVal value of the res whis is to be deleted
       
   395     * @param aThumbailResVal value of the thumbail res whis is to be deleted
       
   396     */
       
   397     void DoDeleteResourceL(const TDesC8& aResVal, RArray<TInt>& aContIds);
       
   398 
       
   399 
       
   400     /**
       
   401     * Sets the childCount attribute in the given object's element.
       
   402     * @since Series S60 3.0
       
   403     * @param aElement object's element
       
   404     * @param aId object's id
       
   405     * @return EUpnpOk, if successful; Otherwise, one of the other Upnp error codes.
       
   406     */
       
   407     void SetChildCountL(TXmlEngElement aElement, TInt aId);
       
   408     
       
   409     /**
       
   410     * Adds all (existing in the database) properties to the object's element.
       
   411     * @since Series S60 3.0
       
   412     * @param aElement object's element
       
   413     * @param aObjBean object table description object
       
   414     */
       
   415     void AddAllPropertiesL(TXmlEngElement aElement, CUpnpObjectBean* aObjBean);
       
   416 
       
   417     /**
       
   418     * Adds new attribute to the element.
       
   419     * @since Series S60 3.0
       
   420     * @param aElement object's element
       
   421     * @param aAttrName the name of the attribute which is to be added
       
   422     * @param aElementId id of the element which the attribute belongs to
       
   423     * @param aObjectId id of the object which the elements belongs to
       
   424     * @return EUpnpOk, if successful; Otherwise, one of the other Upnp error codes.
       
   425     */
       
   426     void AddAttributeL( TXmlEngElement aElement, const TDesC8& aAttrName, TInt aElementId, TInt aObjectId );
       
   427 
       
   428     /**
       
   429     * Adds a requested properties to the object's element.
       
   430     * @since Series S60 3.0
       
   431     * @param aObjectID object's id
       
   432     * @param aElement an array containing filter elements of the requested property
       
   433     * @param aFilterElements ?description
       
   434     * @return EUpnpOk, if successful; Otherwise, one of the other Upnp error codes.
       
   435     */
       
   436     TUpnpErrorCode AddRequestedPropertiesL(TInt aObjectID,TXmlEngElement aElement,
       
   437                                            const RPointerArray<CUpnpFilterElement>& aFilterElements);
       
   438 
       
   439     /**
       
   440     * Adds requested element to the object's element.
       
   441     * @since Series S60 3.0
       
   442     * @param aElement an element wich we want to add a new element to
       
   443     * @param aObjectID id of the object
       
   444     * @param aReqElement filter object of the element to be added
       
   445     * @return EUpnpOk, if successful; Otherwise, one of the other Upnp error codes.
       
   446     */
       
   447     void AddElementL(TXmlEngElement aElement, TInt aObjectID, const CUpnpFilterElement* aReqElement);
       
   448 
       
   449     /**
       
   450     * Adds required property to the object.
       
   451     * @since Series S60 3.0
       
   452     * @param aElement TXmlEngElement of the object which is to be added the required property
       
   453     * @param aObjId id of the object being processed
       
   454     * @param aFilterElement CUpnpFilterElement object of the property to be added
       
   455     * @return EUpnpOk, if successful; Otherwise, one of the other Upnp error codes.
       
   456     */
       
   457     TUpnpErrorCode AddRequiredPropertyL(TXmlEngElement aElement, TInt aObjId, CUpnpFilterElement* aFilterElement);
       
   458     
       
   459     /**
       
   460     * Parses filter string.
       
   461     * @since Series S60 3.0
       
   462     * @param aFilter filter string to be parsed
       
   463     * @param aList  On return, contains CFilterElements objects of the filter string
       
   464     */
       
   465     void ParseFilterStringL(const TDesC8& aFilter, RPointerArray<CUpnpFilterElement>& aList);
       
   466 
       
   467     /**
       
   468     * Performs get object operation.
       
   469     * @since Series S60 3.0
       
   470     * @param aObjectID id of requested object.
       
   471     * @param aDoc handler to document containing object's metadata.
       
   472     * @return EUpnpOk, if successful; Otherwise, one of the other Upnp error codes.
       
   473     */
       
   474     TUpnpErrorCode DoGetObjectL(TInt aObjectID, RXmlEngDocument& aDoc, TBool aAll);
       
   475  
       
   476     /**
       
   477     * Inserts element into database 
       
   478     * @since Series S60 3.0
       
   479     * @param aElementel TXmlEngElement of the element to be inserted
       
   480     * @param aObjId id of the object this element belongs to
       
   481     * @return EUpnpOk, if successful; Otherwise, one of the other Upnp error codes.
       
   482     */
       
   483     TUpnpErrorCode InsertElementL(const TXmlEngElement& aElementel, TInt aObjId);
       
   484  
       
   485     /**
       
   486     * Performs object update; a transaction should be started before calling this function
       
   487     * @since Series S60 3.0
       
   488     * @param aObjId id of the object to be updated
       
   489     * @param  aFragment XML DOM tree with the updated object's metadata
       
   490     * @return EUpnpOk, if successful; Otherwise, one of the other Upnp error codes.
       
   491     */
       
   492     TUpnpErrorCode DoUpdateObjectL(TInt aObjId, TXmlEngElement aFragment);
       
   493 
       
   494     /**
       
   495     * Inserts updated object into database
       
   496     * @since Series S60 3.0
       
   497     * @param aObjId id of the object
       
   498     * @param  aFragment XML DOM tree with the updated object's metadata
       
   499     * @return EUpnpOk, if successful; Otherwise, one of the other Upnp error codes.
       
   500     */
       
   501     TUpnpErrorCode InsertUpdatedL(TInt aObjId, TXmlEngElement& aElement);
       
   502 
       
   503     /**
       
   504     * Sets the id attribute in the given object; adds attribute if does not exist
       
   505     * @since Series S60 3.0
       
   506     * @param aElement TXmlEngElement of the object
       
   507     * @return value of the id
       
   508     */
       
   509     TInt SetObjectIdL(TXmlEngElement& aElement);
       
   510 
       
   511     /**
       
   512     * Inserts object into database; a transaction should be started before calling this function 
       
   513     * @since Series S60 3.0
       
   514     * @param param descr
       
   515     * @return EUpnpOk, if successful; Leaves if the object could not be inserted into the database
       
   516     *     In case it leaves the transaction must be rolled back
       
   517     */
       
   518     TUpnpErrorCode DoInsertObjectL( TXmlEngElement& aElement, TInt aContainerId, TInt* aId);
       
   519 
       
   520 
       
   521     
       
   522     /**
       
   523     * Inserts attributes of the given element into the database
       
   524     * @since Series S60 3.0
       
   525     * @param aElement TXmlEngElement of the element 
       
   526     * @param aElmId id of the element
       
   527     * @return EUpnpOk, if successful; Otherwise, one of the other Upnp error codes.
       
   528     */
       
   529     TUpnpErrorCode InsertAttributesL(const TXmlEngElement aElement, TInt aElmId,TInt aObjId);
       
   530     
       
   531 
       
   532     /**
       
   533     * Checks if the given attribute has a corresponding marker attr in the given array
       
   534     * @since Series S60 3.0
       
   535     * @param aAttr TXmlEngAttr of the attribute to be chceck
       
   536     * @param aMarkers an array containing marker attributes
       
   537     * @return ETrue if the attribute is required, otherwise EFalse
       
   538     */
       
   539     TBool IsAttrRequiredL(const TXmlEngAttr& aAttr, RArray<TXmlEngAttr>& aMarkers);
       
   540 
       
   541     /**
       
   542     * C++ default constructor.
       
   543     */
       
   544     CUpnpContentDirectoryDb(CUpnpMetadataStorage* aMetadataStorage);
       
   545 
       
   546     /**
       
   547     * By default Symbian 2nd phase constructor is private.
       
   548     */
       
   549     void ConstructL();
       
   550 
       
   551     /**
       
   552     * If data base file is present it just opens it, 
       
   553     * otherwise creates new database storage file.
       
   554     * @since Series S60 3.0
       
   555     * @param aDatabaseFileName name of storage file
       
   556     */
       
   557     void ConstructDbL(const TFileName& aDatabaseFileName);
       
   558     
       
   559     /**
       
   560     * Opens existing database.
       
   561     * @since Series S60 3.0
       
   562     * @param aDatabaseFileName name of storage file
       
   563     */
       
   564     void OpenDbL( const TFileName& aDatabaseFileName );
       
   565     
       
   566     /**
       
   567     * Adds elements that are children of inquired object to passed DOM TXmlEngElement.
       
   568     * @param aObjectID - id of the object, which child elements will be added.
       
   569     * @param aObjectElement - element to which the elements will be added.
       
   570     */
       
   571     void AddElementsL( TInt aObjectID, TXmlEngElement aObjectElement, TBool aAll );
       
   572     
       
   573     /**
       
   574     * Adds attributes to passed DOM TXmlEngElement.
       
   575     * @param aElementID - id of the element, which attributes will be added.
       
   576     * @param aObjectId id of the object which the elements belongs to
       
   577     * @param aElement - element to which the attributes will be added.
       
   578     */
       
   579     void AddAttributesL( TInt aElementID, TInt aObjectID, TXmlEngElement& aElement, TBool aAll );
       
   580     
       
   581 
       
   582     
       
   583 
       
   584  private:    // Data
       
   585     CUpnpMetadataStorage* iMetadataStorage; // not owned
       
   586     RXmlEngDOMImplementation iDOMImpl;
       
   587  };
       
   588 
       
   589 #endif //CCONTENTDIRECTORYDB_H
       
   590 
       
   591 // End Of File