mmserv/metadatautility/Src/MetaDataParserRA.cpp
changeset 0 71ca22bcf22a
child 13 f5c5c82a163e
child 20 b67dd1fc57c5
equal deleted inserted replaced
-1:000000000000 0:71ca22bcf22a
       
     1 /*
       
     2 * Copyright (c) 2004 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:  This class implements 
       
    15 *
       
    16 */
       
    17 
       
    18 
       
    19 
       
    20 // INCLUDE FILES
       
    21 #include	"MetaDataParserRA.h"
       
    22 #ifdef _DEBUG
       
    23 #include	<e32svr.h>
       
    24 #endif
       
    25 
       
    26 #include <s32mem.h>
       
    27 #include <hxmetadatautil.h>
       
    28 #include "MetaDataSourceFile.h"
       
    29 
       
    30 
       
    31 // ============================ MEMBER FUNCTIONS ===============================
       
    32 
       
    33 // -----------------------------------------------------------------------------
       
    34 // CMetaDataParserRA::CMetaDataParserRA
       
    35 // C++ default constructor can NOT contain any code, that
       
    36 // might leave.
       
    37 // -----------------------------------------------------------------------------
       
    38 //
       
    39 CMetaDataParserRA::CMetaDataParserRA(
       
    40 	CMetaDataSource& aSource )
       
    41 	:	iSource(aSource)
       
    42 	{
       
    43     }
       
    44 
       
    45 // -----------------------------------------------------------------------------
       
    46 // CMetaDataParserRA::ConstructL
       
    47 // Symbian 2nd phase constructor can leave.
       
    48 // -----------------------------------------------------------------------------
       
    49 //
       
    50 void CMetaDataParserRA::ConstructL()
       
    51     {
       
    52 	if ( ValidateL() )
       
    53 		{
       
    54 		iHxMetaDataUtility = CHXMetaDataUtility::NewL();
       
    55 		}
       
    56 	else
       
    57 	    {
       
    58 	    User::Leave(KErrNotSupported);    
       
    59 	    }
       
    60 	    
       
    61 #ifdef _DEBUG
       
    62 	RDebug::Print(_L("CMetaDataParserRA::ConstructL - Done"));
       
    63 #endif
       
    64     }
       
    65 
       
    66 // -----------------------------------------------------------------------------
       
    67 // CMetaDataParserRA::NewL
       
    68 // Two-phased constructor.
       
    69 // -----------------------------------------------------------------------------
       
    70 //
       
    71 CMetaDataParserRA* CMetaDataParserRA::NewL(
       
    72 	CMetaDataSource& aSource )
       
    73     {
       
    74 #ifdef _DEBUG
       
    75 	RDebug::Print(_L("CMetaDataParserRA::NewL"));
       
    76 #endif
       
    77 	CMetaDataParserRA* self = new( ELeave ) CMetaDataParserRA(aSource);
       
    78     CleanupStack::PushL( self );
       
    79     self->ConstructL();
       
    80     CleanupStack::Pop();
       
    81     return self;
       
    82     }
       
    83 
       
    84 // Destructor
       
    85 CMetaDataParserRA::~CMetaDataParserRA()
       
    86 	{
       
    87 	delete iCharacterSet;
       
    88 	if (iHxMetaDataUtility)
       
    89 	    {
       
    90 	    TRAPD(err, iHxMetaDataUtility->ResetL());
       
    91 	    if (err != KErrNone)
       
    92 	        {
       
    93 	        #ifdef _DEBUG
       
    94 	            RDebug::Print(_L("CMetaDataParserRA::~CMetaDataParserRA(), err=%d"), err);
       
    95 	        #endif
       
    96 	        }
       
    97 	    delete iHxMetaDataUtility;
       
    98 	    }
       
    99 	}
       
   100 
       
   101 // -----------------------------------------------------------------------------
       
   102 // CMetaDataParserRA::ParseL
       
   103 // -----------------------------------------------------------------------------
       
   104 //
       
   105 void CMetaDataParserRA::ParseL(
       
   106 	const RArray<TMetaDataFieldId>& aWantedFields,
       
   107 	CMetaDataFieldContainer& aContainer )
       
   108     {
       
   109 #ifdef _DEBUG
       
   110 	RDebug::Print(_L("CMetaDataParserRA::ParseL"));
       
   111 #endif
       
   112 	iContainer = &aContainer;
       
   113 	TUint count = 0;
       
   114 	HXMetaDataKeys::EHXMetaDataId id;
       
   115 	TFileName fileName;
       
   116 	
       
   117 	// Determine if user entered a TDesC filename or a RFile:
       
   118 	
       
   119 	if (((CMetaDataSourceFile&)iSource).IsFileHandler())
       
   120 	{
       
   121 		RFile rFile;
       
   122 		rFile.Duplicate( ((CMetaDataSourceFile&)iSource).FileHandler() );
       
   123 		TRAPD(err, iHxMetaDataUtility->OpenFileL((RFile &)rFile));	// casting necessary--compile error	
       
   124 		rFile.Close();
       
   125 		User::LeaveIfError(err);
       
   126 	}
       
   127 	else // filename
       
   128 	{
       
   129         if (((CMetaDataSourceFile&)iSource).FileName().Length() > fileName.MaxLength())
       
   130         {
       
   131             #ifdef _DEBUG
       
   132                 RDebug::Print(_L("CMetaDataParserRA::ParseL: Invalid File name"));
       
   133             #endif
       
   134             
       
   135             return;                           
       
   136         }
       
   137 		fileName.Copy(((CMetaDataSourceFile&)iSource).FileName());
       
   138 		iHxMetaDataUtility->OpenFileL(fileName);			
       
   139 	}
       
   140 		
       
   141 	TInt status = iHxMetaDataUtility->GetMetaDataCount(count);
       
   142 #ifdef _DEBUG
       
   143 	RDebug::Print(_L("CMetaDataParserRA::ParseL: Meta Data Count = %d"), count);
       
   144 #endif	
       
   145 
       
   146 	if ( aWantedFields.Count() == 0 ) // Get all attributes from HxMetaDataUtil
       
   147 	{		
       
   148 		for (TUint i=0; i<count;i++)
       
   149 		{
       
   150 			HBufC *pDes = NULL;
       
   151 			status = iHxMetaDataUtility->GetMetaDataAt(i, id, pDes);
       
   152 			if (status == KErrNone)
       
   153 			{
       
   154 				switch (id)
       
   155 				{
       
   156 					case HXMetaDataKeys::EHXTitle:
       
   157 					{
       
   158 						iContainer->AppendL( EMetaDataSongTitle, *pDes );
       
   159 						break;				
       
   160 					}
       
   161 					case HXMetaDataKeys::EHXAuthor:
       
   162 					{
       
   163 						iContainer->AppendL( EMetaDataArtist, *pDes );
       
   164 						break;				
       
   165 					}
       
   166 					case HXMetaDataKeys::EHXGenre:
       
   167 					{
       
   168 						iContainer->AppendL( EMetaDataGenre, *pDes );
       
   169 						break;				
       
   170 					}
       
   171 					case HXMetaDataKeys::EHXPerformer:
       
   172 					{
       
   173 						iContainer->AppendL( EMetaDataComposer, *pDes );
       
   174 						break;				
       
   175 					}
       
   176 					case HXMetaDataKeys::EHXCopyright:
       
   177 					{
       
   178 						iContainer->AppendL( EMetaDataCopyright, *pDes );
       
   179 						break;				
       
   180 					}												
       
   181 					default:
       
   182 						break;
       
   183 						
       
   184 				} // End switch
       
   185 			} // end if
       
   186 			else
       
   187 			{
       
   188 #ifdef _DEBUG
       
   189 	RDebug::Print(_L("CMetaDataParserRA::ParseL: Error %d returned for count = %d"), status, count);
       
   190 #endif	
       
   191 				
       
   192 			}
       
   193 
       
   194 		} // end  For
       
   195 	} // end if
       
   196 	else   	// Only get attributes in the wanted field array
       
   197 		{
       
   198 			TInt count( aWantedFields.Count() );
       
   199 			TInt err = KErrNone;
       
   200 			for ( TInt i = 0; i < count; i++ )
       
   201 			{
       
   202 				switch ( aWantedFields[ i ] )
       
   203 				{
       
   204 					case EMetaDataSongTitle:
       
   205 						err = GetTitleL(count);
       
   206 						break;
       
   207 					case EMetaDataArtist:
       
   208 						err = GetArtistL(count);
       
   209 						break;
       
   210 					case EMetaDataGenre:
       
   211 						err = GetGenreL(count);
       
   212 						break;
       
   213 					case EMetaDataComposer:					
       
   214 						err = GetComposerL(count);
       
   215 						break;									
       
   216 					case EMetaDataCopyright:
       
   217 						err = GetCopyrightL(count);
       
   218 						break;
       
   219 					default:
       
   220 					break;
       
   221 				} // end switch
       
   222 				if (err != KErrNone)
       
   223 					{
       
   224 					// Handle error
       
   225 					}
       
   226 			} // end for
       
   227 		} // end else
       
   228     }
       
   229 
       
   230 // -----------------------------------------------------------------------------
       
   231 // CMetaDataParserRA::ValidateL
       
   232 // -----------------------------------------------------------------------------
       
   233 //
       
   234 TBool CMetaDataParserRA::ValidateL()
       
   235 	{
       
   236 	TInt size;
       
   237 	User::LeaveIfError( iSource.Size( size ) );
       
   238 	if ( size <= 0 )
       
   239 		{
       
   240 		return EFalse;
       
   241 		}
       
   242 		
       
   243 		// Anything else? Call GetMetaDataCount?
       
   244 		
       
   245 	return ETrue;
       
   246 	}
       
   247 
       
   248 // -----------------------------------------------------------------------------
       
   249 // CMetaDataParserRA::OpenFileL
       
   250 // 
       
   251 // -----------------------------------------------------------------------------
       
   252 //
       
   253 void CMetaDataParserRA::OpenFileL(RFile& aFile)
       
   254     {
       
   255 #ifdef _DEBUG
       
   256 	RDebug::Print(_L("CMetaDataParserRA::OpenFileL"));
       
   257 #endif
       
   258 
       
   259 	if (iHxMetaDataUtility)
       
   260 		{
       
   261 		iHxMetaDataUtility->OpenFileL((TDesC &)aFile);	
       
   262 		}
       
   263     }
       
   264 
       
   265 // -----------------------------------------------------------------------------
       
   266 //
       
   267 void CMetaDataParserRA::OpenDesL(const TDesC8& aDes)
       
   268     {
       
   269 #ifdef _DEBUG
       
   270 	RDebug::Print(_L("CMetaDataParserRA::OpenDesL"));
       
   271 #endif
       
   272 
       
   273 	if (iHxMetaDataUtility)
       
   274 		{
       
   275 		iHxMetaDataUtility->OpenDesL(aDes);	
       
   276 		}
       
   277     }
       
   278 
       
   279 // -----------------------------------------------------------------------------
       
   280 // CMetaDataParserRA::GetTitleL
       
   281 // -----------------------------------------------------------------------------
       
   282 //
       
   283 TInt CMetaDataParserRA::GetTitleL(TInt aCount)
       
   284 	{
       
   285 	TInt status = KErrNotFound;
       
   286 	HXMetaDataKeys::EHXMetaDataId id;
       
   287 	iData = NULL;
       
   288 	status = iHxMetaDataUtility->GetMetaDataAt(aCount, id, iData);
       
   289 	if (id == HXMetaDataKeys::EHXTitle)
       
   290 	{
       
   291 		iContainer->AppendL( EMetaDataSongTitle, *iData );
       
   292 		return KErrNone;			
       
   293 	}		
       
   294 	return status;
       
   295 	}
       
   296 
       
   297 // -----------------------------------------------------------------------------
       
   298 // CMetaDataParserRA::GetArtistL
       
   299 // -----------------------------------------------------------------------------
       
   300 //
       
   301 TInt CMetaDataParserRA::GetArtistL(TInt aCount)
       
   302 	{
       
   303 	TInt status = KErrNotFound;
       
   304 	HXMetaDataKeys::EHXMetaDataId id;
       
   305 	iData = NULL;
       
   306 	status = iHxMetaDataUtility->GetMetaDataAt(aCount, id, iData);
       
   307 	if (id == HXMetaDataKeys::EHXAuthor)
       
   308 	{
       
   309 		iContainer->AppendL( EMetaDataArtist, *iData );
       
   310 		return KErrNone;			
       
   311 	}		
       
   312 	return status;
       
   313 	}
       
   314 	
       
   315 // -----------------------------------------------------------------------------
       
   316 // CMetaDataParserRA::GetGenreL
       
   317 // -----------------------------------------------------------------------------
       
   318 //
       
   319 TInt CMetaDataParserRA::GetGenreL(TInt aCount)
       
   320 	{
       
   321 	TInt status = KErrNotFound;
       
   322 	HXMetaDataKeys::EHXMetaDataId id;
       
   323 	iData = NULL;
       
   324 	status = iHxMetaDataUtility->GetMetaDataAt(aCount, id, iData);
       
   325 	if (id == HXMetaDataKeys::EHXGenre)
       
   326 	{
       
   327 		iContainer->AppendL( EMetaDataGenre, *iData );
       
   328 		return KErrNone;			
       
   329 	}		
       
   330 	return status;
       
   331 	}	
       
   332 
       
   333 // -----------------------------------------------------------------------------
       
   334 // CMetaDataParserRA::GeComposerL
       
   335 // -----------------------------------------------------------------------------
       
   336 //
       
   337 TInt CMetaDataParserRA::GetComposerL(TInt aCount)
       
   338 	{
       
   339 	TInt status = KErrNotFound;
       
   340 	HXMetaDataKeys::EHXMetaDataId id;
       
   341 	iData = NULL;
       
   342 	status = iHxMetaDataUtility->GetMetaDataAt(aCount, id, iData);
       
   343 	if (id == HXMetaDataKeys::EHXPerformer)
       
   344 	{
       
   345 		iContainer->AppendL( EMetaDataComposer, *iData );
       
   346 		return KErrNone;			
       
   347 	}		
       
   348 	return status;
       
   349 	}	
       
   350 
       
   351 // -----------------------------------------------------------------------------
       
   352 // CMetaDataParserRA::GetCopyrightL
       
   353 // -----------------------------------------------------------------------------
       
   354 //
       
   355 TInt CMetaDataParserRA::GetCopyrightL(TInt aCount)
       
   356 	{
       
   357 	TInt status = KErrNotFound;
       
   358 	HXMetaDataKeys::EHXMetaDataId id;
       
   359 	iData = NULL;
       
   360 	status = iHxMetaDataUtility->GetMetaDataAt(aCount, id, iData);
       
   361 	if (id == HXMetaDataKeys::EHXCopyright)
       
   362 	{
       
   363 		iContainer->AppendL( EMetaDataCopyright, *iData );
       
   364 		return KErrNone;			
       
   365 	}		
       
   366 	return status;
       
   367 	}	
       
   368 
       
   369 //  End of File