--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/clfwrapper/ClientSrc/CCLFItemImpl.cpp Mon Jan 18 20:34:07 2010 +0200
@@ -0,0 +1,639 @@
+/*
+* Copyright (c) 2002-2009 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:
+*
+*/
+
+
+// INCLUDE FILES
+#include "CCLFItemImpl.h"
+#include "CCLFDbItemContainer.h"
+#include "CLFConsts.h"
+#include "CLF2MdEConsts.h"
+#include <f32file.h>
+#include "MGDebugPrint.h"
+#include <mdesession.h>
+#include <mdetextproperty.h>
+#include <mdenumberproperty.h>
+#include <mdeobjectdef.h>
+#include <mdeconstants.h>
+
+// ============================ MEMBER FUNCTIONS ===============================
+
+// -----------------------------------------------------------------------------
+// CCLFItemImpl::CCLFItemImpl
+// -----------------------------------------------------------------------------
+//
+CCLFItemImpl::CCLFItemImpl( CCLFContainerItem& aContainerItem,
+ CCLFDbItemContainer& aDbItemContainer )
+ : iItem( aContainerItem ),
+ iMdEObject( aContainerItem.DbItem() ),
+ iDbItemContainer( aDbItemContainer )
+ {
+ iItem.IncreaseReferenceCount();
+ }
+
+// -----------------------------------------------------------------------------
+// CCLFItemImpl::NewLC
+// -----------------------------------------------------------------------------
+//
+CCLFItemImpl* CCLFItemImpl::NewLC( CCLFContainerItem& aContainerItem,
+ CCLFDbItemContainer& aDbItemContainer )
+ {
+ CCLFItemImpl* self =
+ new ( ELeave ) CCLFItemImpl( aContainerItem, aDbItemContainer );
+
+ CleanupStack::PushL( self );
+
+ return self;
+ }
+
+// -----------------------------------------------------------------------------
+// CCLFItemImpl::NewL
+// -----------------------------------------------------------------------------
+//
+CCLFItemImpl* CCLFItemImpl::NewL( CCLFContainerItem& aContainerItem,
+ CCLFDbItemContainer& aDbItemContainer )
+ {
+ return new( ELeave ) CCLFItemImpl( aContainerItem, aDbItemContainer );
+ }
+
+// -----------------------------------------------------------------------------
+// CCLFItemImpl::~CCLFItemImpl
+// Destructor
+// -----------------------------------------------------------------------------
+//
+CCLFItemImpl::~CCLFItemImpl()
+ {
+ iDbItemContainer.ReleaseItem( &iItem );
+ }
+
+// -----------------------------------------------------------------------------
+// CCLFItemImpl::ItemId
+// -----------------------------------------------------------------------------
+//
+TCLFItemId CCLFItemImpl::ItemId() const
+ {
+ TCLFItemId id = (TCLFItemId) iMdEObject.Id();
+ return id;
+ }
+
+// -----------------------------------------------------------------------------
+// CCLFItemImpl::DataType
+// -----------------------------------------------------------------------------
+//
+TCLFItemDataType CCLFItemImpl::DataType( const TCLFFieldId aFieldId ) const
+ {
+ MG_DEBUG2( DT, "[CLF]\t CCLFItemImpl::DataType aFieldId: %d", aFieldId );
+
+ TCLFItemDataType ret = ECLFItemDataTypeNull;
+ const TDesC& property = MapFieldToMdEProperty( aFieldId );
+
+ if ( property != KNullDesC )
+ {
+ const CMdEPropertyDef* propertyDef = NULL;
+ TRAP_IGNORE( propertyDef = &iMdEObject.Def().GetPropertyDefL( property ));
+
+ switch ( propertyDef->PropertyType())
+ {
+ case EPropertyBool:
+ case EPropertyInt8:
+ case EPropertyUint8:
+ case EPropertyInt16:
+ case EPropertyUint16:
+ case EPropertyInt32:
+ case EPropertyUint32:
+ case EPropertyInt64:
+ case EPropertyReal32:
+ case EPropertyReal64:
+ {
+ ret = ECLFItemDataTypeTInt32;
+ break;
+ }
+ case EPropertyTime:
+ {
+ ret = ECLFItemDataTypeTTime;
+ break;
+ }
+ case EPropertyText:
+ {
+ ret = ECLFItemDataTypeDesC;
+ break;
+ }
+ default:
+ {
+ /* Fall through */
+ break;
+ }
+ }
+ }
+ return ret;
+ }
+
+// -----------------------------------------------------------------------------
+// CCLFItemImpl::DeduceFieldFromURI
+// -----------------------------------------------------------------------------
+//
+TBool CCLFItemImpl::DeduceFieldFromURI( const TCLFFieldId aFieldId, TPtrC& aValue ) const
+ {
+ TBool done = ETrue;
+ TPtrC path = iMdEObject.Uri();
+ TParsePtrC nameParse( path );
+
+ switch ( aFieldId )
+ {
+ case ECLFFieldIdFileName:
+ {
+ aValue.Set( nameParse.Name() );
+ break;
+ }
+ case ECLFFieldIdFileExtension:
+ {
+ aValue.Set( nameParse.Ext() );
+ break;
+ }
+ case ECLFFieldIdPath:
+ {
+ aValue.Set( nameParse.Path() );
+ break;
+ }
+ case ECLFFieldIdDrive:
+ {
+ aValue.Set( nameParse.Drive() );
+ break;
+ }
+ case ECLFFieldIdFileNameAndPath:
+ {
+ aValue.Set( path );
+ break;
+ }
+ default:
+ {
+ done = EFalse; // Field deduction from URI did not work.
+ break;
+ }
+ }
+ return done;
+ }
+
+// -----------------------------------------------------------------------------
+// CCLFItemImpl::GetMediaTypeL
+// -----------------------------------------------------------------------------
+//
+TInt CCLFItemImpl::GetMediaTypeL( CMdEObjectDef& aObjectDef, TInt32& aValue ) const
+ {
+ const TDesC* mdemediatypes[] =
+ {
+ &MdeConstants::Audio::KAudioObject,
+ &MdeConstants::Video::KVideoObject,
+ &MdeConstants::Image::KImageObject,
+ };
+ const TInt clfmediatypes[] =
+ {
+ ECLFMediaTypeSound,
+ ECLFMediaTypeVideo,
+ ECLFMediaTypeImage,
+ };
+ const TPtrC name = aObjectDef.Name();
+ TInt32 error = KErrNotFound;
+
+ aValue = ECLFMediaTypeUnknown; // Default to this.
+ for ( TInt i = 0; i < sizeof( clfmediatypes ) / sizeof( TInt ); ++i )
+ {
+ if ( name.Compare( *mdemediatypes[ i ] ) == 0 )
+ {
+ aValue = clfmediatypes[ i ];
+ error = KErrNone;
+ break;
+ }
+ }
+
+ if ( aValue == ECLFMediaTypeSound )
+ {
+ DetermineIfMusicL( aObjectDef, aValue );
+ }
+ return error;
+ }
+
+// -----------------------------------------------------------------------------
+// CCLFItemImpl::DetermineIfMusicL
+// -----------------------------------------------------------------------------
+//
+void CCLFItemImpl::DetermineIfMusicL( CMdEObjectDef& aObjectDef, TInt32& aValue ) const
+ {
+ // This is a hard-coded list used to determine if the media type is music. CLF uses a
+ // separate MIME type manager to map MIME types to CLF media types, but this is located on
+ // the CLF server side, which this wrapper removes/obsoletes. The MIME type manager uses a
+ // resource file for mapping MIME types.
+ const TDesC* clfwrappermusictypes[] =
+ {
+ &KCLFWrapperMusicTypeMpeg,
+ &KCLFWrapperMusicTypeAac,
+ &KCLFWrapperMusicTypeMp3,
+ &KCLFWrapperMusicTypeX_Mp3,
+ &KCLFWrapperMusicTypeMp4,
+ &KCLFWrapperMusicType3gpp,
+ &KCLFWrapperMusicTypeM4a,
+ &KCLFWrapperMusicType3gpp2,
+ &KCLFWrapperMusicTypeMpeg4,
+ &KCLFWrapperMusicTypeX_Pn_RealAudio,
+ &KCLFWrapperMusicTypeX_Ms_Wma,
+ };
+
+ const CMdEPropertyDef* propertyDef = NULL;
+ propertyDef = &aObjectDef.GetPropertyDefL( MdeConstants::Object::KItemTypeProperty );
+
+ if ( propertyDef )
+ {
+ // Get the actual data
+ CMdEProperty* prop = NULL;
+ TInt index = iMdEObject.Property( *propertyDef, prop );
+ if ( prop )
+ {
+ const TInt num = sizeof ( clfwrappermusictypes ) / sizeof( TDesC* );
+
+ for ( TInt i = 0; i < num; ++i )
+ {
+ if ( *clfwrappermusictypes[ i ] == prop->TextValueL() )
+ {
+ aValue = ECLFMediaTypeMusic;
+ break;
+ }
+ }
+ }
+ }
+ }
+
+// -----------------------------------------------------------------------------
+// CCLFItemImpl::GetField
+// -----------------------------------------------------------------------------
+//
+TInt CCLFItemImpl::GetField( const TCLFFieldId aFieldId, TPtrC& aValue ) const
+ {
+ MG_DEBUG2( GF, "[CLF]\t CCLFItemImpl::GetField (TPtrC) aFieldId: %d", aFieldId );
+ TInt error = KErrNotFound;
+
+ if ( DeduceFieldFromURI( aFieldId, aValue ))
+ {
+ error = KErrNone;
+ }
+ else
+ {
+ // Get property
+ const TDesC& property = MapFieldToMdEProperty( aFieldId );
+ if ( property != KNullDesC )
+ {
+ CMdEPropertyDef* propertyDef = NULL;
+ TRAP_IGNORE( propertyDef = &iMdEObject.Def().GetPropertyDefL( property ));
+
+ if ( propertyDef )
+ {
+ // Get the actual data
+ CMdEProperty* prop = NULL;
+ const TInt index = iMdEObject.Property( *propertyDef, prop );
+ if ( prop )
+ {
+ if ( index >= 0 )
+ {
+ CMdETextProperty* textprop = ( CMdETextProperty* ) prop;
+ aValue.Set( textprop->Value() );
+ MG_DEBUG2( GF2, "[CLF]\t CCLFItemImpl::GetField value %S", &aValue );
+ error = KErrNone;
+ }
+ }
+ }
+ }
+ }
+
+ MG_DEBUG2( GF3, "[CLF]\t CCLFItemImpl::GetField (TPtrC) end %d", error );
+ return error;
+ }
+
+// -----------------------------------------------------------------------------
+// CCLFItemImpl::GetField
+// -----------------------------------------------------------------------------
+//
+TInt CCLFItemImpl::GetField( const TCLFFieldId aFieldId, TInt32& aValue ) const
+ {
+ MG_DEBUG2( GF4, "[CLF]\t CCLFItemImpl::GetField (TInt) aFieldId: %d", aFieldId );
+ TInt error = KErrNotFound;
+
+ // Get property
+ const TDesC& property = MapFieldToMdEProperty( aFieldId );
+ if ( property != KNullDesC )
+ {
+ CMdEPropertyDef* propertyDef = NULL;
+ TRAP_IGNORE( propertyDef = &iMdEObject.Def().GetPropertyDefL( property ));
+
+ if ( propertyDef )
+ {
+ // Get the actual data
+ CMdEProperty* prop = NULL;
+ const TInt index = iMdEObject.Property( *propertyDef, prop );
+ if ( prop )
+ {
+ if ( index >= 0 )
+ {
+ // The following code is a Gallery behavior fix.
+ if ( &property == &MdeConstants::MediaObject::KTrackProperty )
+ {
+ error = KErrNone;
+ TRAP( error, aValue = prop->Uint16ValueL());
+ }
+ else
+ {
+ error = KErrNone;
+ TRAP( error, aValue = prop->Uint32ValueL());
+ }
+ }
+ }
+ }
+ }
+ else
+ {
+ // Media type is checked here.
+ if ( aFieldId == ECLFFieldIdMediaType )
+ {
+ CMdEObjectDef& objectDef = iMdEObject.Def();
+ TRAP( error, error = GetMediaTypeL( objectDef, aValue ));
+ }
+ }
+
+ return error;
+ }
+
+// -----------------------------------------------------------------------------
+// CCLFItemImpl::GetField
+// -----------------------------------------------------------------------------
+//
+TInt CCLFItemImpl::GetField( const TCLFFieldId aFieldId, TTime& aValue ) const
+ {
+ MG_DEBUG2( GF6, "[CLF]\t CCLFItemImpl::GetField (TTime) aFieldId: %d", aFieldId );
+ TInt error = KErrNotFound;
+
+ // Get property
+ const TDesC& property = MapFieldToMdEProperty( aFieldId );
+ if ( property != KNullDesC )
+ {
+ CMdEPropertyDef* propertyDef = NULL;
+ TRAP_IGNORE( propertyDef = &iMdEObject.Def().GetPropertyDefL( property ));
+
+ if ( propertyDef )
+ {
+ // Get the actual data
+ CMdEProperty* prop = NULL;
+ const TInt index = iMdEObject.Property( *propertyDef, prop );
+ if ( prop )
+ {
+ if ( index >= 0 )
+ {
+ CMdETimeProperty* timeprop = ( CMdETimeProperty* ) prop;
+ TRAP_IGNORE( aValue = timeprop->Value() ); // Value() is leaving function
+ error = KErrNone;
+ }
+ }
+ }
+ }
+
+ return error;
+ }
+
+// -----------------------------------------------------------------------------
+// CCLFItemImpl::MapFieldToMdEProperty
+// -----------------------------------------------------------------------------
+//
+const TDesC& CCLFItemImpl::MapFieldToMdEProperty( const TCLFFieldId aField )
+ {
+ MG_DEBUG2( MFP, "[CLF]\t CCLFItemImpl::MapFieldToMdEProperty aField: %d", aField );
+ const TDesC* ret;
+
+ switch ( aField )
+ {
+ /// integer
+ case ECLFFieldIdFileSize:
+ {
+ ret = &MdeConstants::Object::KSizeProperty;
+ break;
+ }
+ /// File date field:
+ /// date/time
+ case ECLFFieldIdFileDate:
+ {
+ ret = &MdeConstants::Object::KLastModifiedDateProperty;
+ break;
+ }
+ /// Mime type field:
+ /// descriptor
+ case ECLFFieldIdMimeType:
+ {
+ ret = &MdeConstants::Object::KItemTypeProperty;
+ break;
+ }
+ /// Music file song name tag:
+ /// descriptor
+ case ECLFFieldIdSongName:
+ {
+ ret = &MdeConstants::Object::KTitleProperty;
+ break;
+ }
+ /// Music file artist tag:
+ /// descriptor
+ case ECLFFieldIdArtist:
+ {
+ ret = &MdeConstants::MediaObject::KArtistProperty;
+ break;
+ }
+ /// Music file album tag:
+ /// descriptor
+ case ECLFFieldIdAlbum:
+ {
+ ret = &MdeConstants::Audio::KAlbumProperty;
+ break;
+ }
+ /// Music file genre tag:
+ /// descriptor
+ case ECLFFieldIdGenre:
+ {
+ ret = &MdeConstants::MediaObject::KGenreProperty;
+ break;
+ }
+ /// Music file track number tag:
+ /// integer
+ case ECLFFieldIdTrackNumber:
+ {
+ ret = &MdeConstants::MediaObject::KTrackProperty;
+ break;
+ }
+ /// Music file composer tag:
+ /// descriptor
+ case ECLFFieldIdComposer:
+ {
+ ret = &MdeConstants::Audio::KComposerProperty;
+ break;
+ }
+ default:
+ {
+ ret = &KNullDesC;
+ break;
+ }
+ }
+ return *ret;
+ }
+
+// -----------------------------------------------------------------------------
+// CCLFModifiableItemImpl::CCLFModifiableItemImpl
+// -----------------------------------------------------------------------------
+//
+CCLFModifiableItemImpl::CCLFModifiableItemImpl()
+ {
+ }
+
+// -----------------------------------------------------------------------------
+// CCLFModifiableItemImpl::NewL
+// -----------------------------------------------------------------------------
+//
+CCLFModifiableItemImpl* CCLFModifiableItemImpl::NewL()
+ {
+ return new ( ELeave ) CCLFModifiableItemImpl();
+ }
+
+// -----------------------------------------------------------------------------
+// CCLFModifiableItemImpl::~CCLFModifiableItemImpl
+// -----------------------------------------------------------------------------
+//
+CCLFModifiableItemImpl::~CCLFModifiableItemImpl()
+ {
+ iIntMap.Close();
+ iTimeMap.Close();
+
+ THashMapIter<TCLFFieldId, HBufC*> hashIter(iTextMap);
+ for ( HBufC* const* p = hashIter.NextValue(); p; p = hashIter.NextValue() )
+ {
+ delete *p;
+ }
+ iTextMap.Close();
+ }
+
+// -----------------------------------------------------------------------------
+// CCLFModifiableItemImpl::ItemId
+// -----------------------------------------------------------------------------
+//
+TCLFItemId CCLFModifiableItemImpl::ItemId() const
+ {
+ const TInt id = 1;
+ return id;
+ }
+
+// -----------------------------------------------------------------------------
+// CCLFModifiableItemImpl::DataType
+// -----------------------------------------------------------------------------
+//
+TCLFItemDataType CCLFModifiableItemImpl::DataType( const TCLFFieldId aFieldId ) const
+ {
+ if (iIntMap.Find(aFieldId))
+ {
+ return ECLFItemDataTypeTInt32;
+ }
+ else if (iTimeMap.Find(aFieldId))
+ {
+ return ECLFItemDataTypeTTime;
+ }
+ else if (iTextMap.Find(aFieldId))
+ {
+ return ECLFItemDataTypeDesC;
+ }
+ else
+ {
+ return ECLFItemDataTypeNull;
+ }
+ }
+
+// -----------------------------------------------------------------------------
+// CCLFModifiableItemImpl::GetField
+// -----------------------------------------------------------------------------
+//
+TInt CCLFModifiableItemImpl::GetField( const TCLFFieldId aFieldId,
+ TPtrC& aValue ) const
+ {
+ if (iTextMap.Find(aFieldId))
+ {
+ aValue.Set( (*iTextMap.Find(aFieldId))->Des() );
+ return KErrNone;
+ }
+
+ return KErrNotFound;
+ }
+
+// -----------------------------------------------------------------------------
+// CCLFModifiableItemImpl::GetField
+// -----------------------------------------------------------------------------
+//
+TInt CCLFModifiableItemImpl::GetField( const TCLFFieldId aFieldId,
+ TInt32& aValue ) const
+ {
+ if (iIntMap.Find(aFieldId))
+ {
+ aValue = *iIntMap.Find(aFieldId);
+ return KErrNone;
+ }
+
+ return KErrNotFound;
+ }
+
+// -----------------------------------------------------------------------------
+// CCLFModifiableItemImpl::GetField
+// -----------------------------------------------------------------------------
+//
+TInt CCLFModifiableItemImpl::GetField( const TCLFFieldId aFieldId,
+ TTime& aValue ) const
+ {
+ if (iTimeMap.Find(aFieldId))
+ {
+ aValue = TTime(*iTimeMap.Find(aFieldId));
+ return KErrNone;
+ }
+
+ return KErrNotFound;
+ }
+
+// -----------------------------------------------------------------------------
+// CCLFModifiableItemImpl::AddFieldL
+// -----------------------------------------------------------------------------
+//
+void CCLFModifiableItemImpl::AddFieldL( TCLFFieldId aFieldID,
+ const TDesC& aValue )
+ {
+ iTextMap.InsertL( aFieldID, aValue.AllocL() );
+ }
+
+// -----------------------------------------------------------------------------
+// CCLFModifiableItemImpl::AddFieldL
+// -----------------------------------------------------------------------------
+//
+void CCLFModifiableItemImpl::AddFieldL( TCLFFieldId aFieldID, TInt32 aValue )
+ {
+ iIntMap.InsertL( aFieldID, aValue );
+ }
+
+// -----------------------------------------------------------------------------
+// CCLFModifiableItemImpl::AddFieldL
+// -----------------------------------------------------------------------------
+//
+void CCLFModifiableItemImpl::AddFieldL( TCLFFieldId aFieldID,
+ const TTime& aValue )
+ {
+ iTimeMap.InsertL( aFieldID, aValue.Int64() );
+ }
+
+// End of File