khronosfws/openmax_al/src/mmf_adaptation/cmetadatautilityitf.cpp
changeset 31 8dfd592727cb
parent 22 128eb6a32b84
child 42 1fa3fb47b1e3
equal deleted inserted replaced
22:128eb6a32b84 31:8dfd592727cb
     1 /*
     1 /*
     2 * Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
     2  * Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
     3 * All rights reserved.
     3  * All rights reserved.
     4 * This component and the accompanying materials are made available
     4  * This component and the accompanying materials are made available
     5 * under the terms of "Eclipse Public License v1.0"
     5  * under the terms of "Eclipse Public License v1.0"
     6 * which accompanies this distribution, and is available
     6  * which accompanies this distribution, and is available
     7 * at the URL "http://www.eclipse.org/legal/epl-v10.html".
     7  * at the URL "http://www.eclipse.org/legal/epl-v10.html".
     8 *
     8  *
     9 * Initial Contributors:
     9  * Initial Contributors:
    10 * Nokia Corporation - initial contribution.
    10  * Nokia Corporation - initial contribution.
    11 *
    11  *
    12 * Contributors:
    12  * Contributors:
    13 *
    13  *
    14 * Description: 
    14  * Description: Metadata backend engine
    15 *
    15  *
    16 */
    16  */
    17 #include "cmetadatautilityitf.h"
    17 
    18 #include <OpenMAXAL.h>
    18 #include <OpenMAXAL.h>
    19 #include <string.h>
    19 #include <string.h>
    20 #include <ctype.h>
    20 #include <ctype.h>
    21 #include <uri8.h>
    21 #include <uri8.h>
       
    22 #include "cmetadatautilityitf.h"
    22 #include "profileutilmacro.h"
    23 #include "profileutilmacro.h"
    23 
    24 
    24 CMetadataUtilityItf::CMetadataUtilityItf():m_pS60Util(NULL), m_pHXUtil(NULL)
    25 CMetadataUtilityItf::CMetadataUtilityItf() :
    25 {
    26     m_pS60Util(NULL), m_pHXUtil(NULL)
    26 }
    27     {
       
    28     }
    27 
    29 
    28 CMetadataUtilityItf::~CMetadataUtilityItf()
    30 CMetadataUtilityItf::~CMetadataUtilityItf()
    29 {
    31     {
    30 	if(m_pS60Util)
    32     if (m_pS60Util)
    31 	{
    33         {
    32 		delete m_pS60Util;
    34         delete m_pS60Util;
    33 	}
    35         }
    34 
    36 
    35 	if(m_pHXUtil)
    37     if (m_pHXUtil)
    36 	{
    38         {
    37 		delete m_pHXUtil;
    39         delete m_pHXUtil;
    38 	}
    40         }
    39 }
    41     }
    40 
       
    41 
    42 
    42 CMetadataUtilityItf* CMetadataUtilityItf::New(char* uri)
    43 CMetadataUtilityItf* CMetadataUtilityItf::New(char* uri)
    43 {
    44     {
    44 	CMetadataUtilityItf* p_mdutilitf = new CMetadataUtilityItf;
    45     CMetadataUtilityItf* p_mdutilitf = new CMetadataUtilityItf;
    45 	
    46 
    46 	TInt ret = p_mdutilitf->ParseSource(uri);
    47     p_mdutilitf->ParseSource(uri); //ignore error
    47 
    48 
    48 	if(ret == KErrNone)
    49     return p_mdutilitf;
    49 	{
    50     }
    50 		return p_mdutilitf; 
       
    51 	}
       
    52 
       
    53 	delete p_mdutilitf;
       
    54 	return NULL;
       
    55 }
       
    56 
    51 
    57 TInt CMetadataUtilityItf::OpenSource(char* pOrigUri)
    52 TInt CMetadataUtilityItf::OpenSource(char* pOrigUri)
    58 {
    53     {
    59     //Make a local copy for uri
    54     //Make a local copy for uri
    60     if ( !pOrigUri )
    55     if (!pOrigUri)
    61         return XA_RESULT_PARAMETER_INVALID;
    56         return XA_RESULT_PARAMETER_INVALID;
    62     
    57 
    63     int uriLen = strlen(pOrigUri);
    58     int uriLen = strlen(pOrigUri);
    64     char* uri = new char[uriLen+1];
    59     char* uri = new char[uriLen + 1];
    65     if (! uri )
    60     if (!uri)
    66         {
    61         {
    67         return XA_RESULT_MEMORY_FAILURE;
    62         return XA_RESULT_MEMORY_FAILURE;
    68         }
    63         }
    69     strncpy(uri, pOrigUri, uriLen);
    64     strncpy(uri, pOrigUri, uriLen);
    70     uri[uriLen] = '\0';
    65     uri[uriLen] = '\0';
    71     //
    66     ////////////////////////////////////////////
    72 
    67     _LIT8(KFileSlash,"file:///");
    73     _LIT8(KFileSlash,"file://");
       
    74     TInt fileslashlen = KFileSlash().Length();
    68     TInt fileslashlen = KFileSlash().Length();
    75 
    69 
    76     TPtr8 fileuri((TUint8*)uri, strlen(uri),strlen(uri));
    70     TPtr8 fileuri((TUint8*) uri, strlen(uri), strlen(uri));
    77     TPtr8 filepath = fileuri.RightTPtr(strlen(uri)-fileslashlen);
    71     TPtr8 filepath = fileuri.RightTPtr(strlen(uri) - fileslashlen);
    78  
    72 
    79     TInt pos = filepath.LocateReverse(':');
    73     TInt pos = filepath.LocateReverse(':');
    80     if(pos != KErrNotFound)
    74     if (pos != KErrNotFound)
    81     {
    75         {
    82         fileuri.Delete(fileslashlen+pos,1);
    76         fileuri.Delete(fileslashlen + pos, 1);
    83     }
    77         }
    84 
    78 
    85     TUriParser8 localfileUri;
    79     TUriParser8 localfileUri;
    86     TInt ret = localfileUri.Parse(fileuri);
    80     TInt ret = localfileUri.Parse(fileuri);
    87     if(ret == KErrNone)
    81     if (ret == KErrNone)
    88     {    
    82         {
    89         HBufC* file = NULL;
    83         HBufC* file = NULL;
    90         TRAP(ret,file = localfileUri.GetFileNameL());  
    84         TRAP(ret,file = localfileUri.GetFileNameL());
    91         if(ret == KErrNone)
    85         if (ret == KErrNone)
    92         {
    86             {
    93         	if(m_pS60Util)
    87             if (m_pS60Util)
    94         	{
    88                 {
    95             	ret = m_pS60Util->ParseSource(*file);
    89                 ret = m_pS60Util->ParseSource(*file);
    96         	}
    90                 }
    97 			else if(m_pHXUtil)
    91             else if (m_pHXUtil)
    98 			{
    92                 {
    99 				ret = m_pHXUtil->ParseSource(*file);
    93                 ret = m_pHXUtil->ParseSource(*file);
   100 			}
    94                 }
   101 			else
    95             else
   102 			{
    96                 {
   103 				ret = KErrNotFound;
    97                 ret = KErrNotFound;
   104 			}
    98                 }
   105         }
    99             }
   106         
   100 
   107         delete file;
   101         delete file;
   108     }
   102         }
   109     
   103 
   110     if(uri)
   104     if (uri)
   111     {
   105         {
   112         delete []uri;
   106         delete[] uri;
   113     }
   107         }
   114     
   108 
   115 	return ret;
   109     if (ret != KErrNone)
   116 }
   110         {
   117 
   111         //delete the utilities
   118 TInt CMetadataUtilityItf::ExtractUCS2(TDesC& inDes, char* outPtr,TInt maxLen)
   112         if (m_pS60Util)
   119 {
   113             {
   120 	TPtrC tempPtr = inDes.Left((maxLen/2)-1); //save last one for null terminator
   114             delete m_pS60Util;
   121 	TInt outLen = tempPtr.Length() + 1;
   115             m_pS60Util = NULL;
   122 	
   116             }
   123 	TPtr16 outDes((unsigned short*)outPtr, outLen);
   117 
   124 	outDes.Copy(tempPtr);
   118         if (m_pHXUtil)
   125 	outDes.ZeroTerminate();
   119             {
   126 
   120             delete m_pHXUtil;
   127 	return outLen * 2; //return size
   121             m_pHXUtil = NULL;
   128 }
   122             }
       
   123 
       
   124         }
       
   125     return ret;
       
   126     }
       
   127 
       
   128 TInt CMetadataUtilityItf::ExtractUCS2(TDesC& inDes, char* outPtr, TInt maxLen)
       
   129     {
       
   130     TPtrC tempPtr = inDes.Left((maxLen / 2) - 1); //save last one for null terminator
       
   131     TInt outLen = tempPtr.Length() + 1;
       
   132 
       
   133     TPtr16 outDes((unsigned short*) outPtr, outLen);
       
   134     outDes.Copy(tempPtr);
       
   135     outDes.ZeroTerminate();
       
   136 
       
   137     return outLen * 2; //return size
       
   138     }
   129 
   139 
   130 TInt CMetadataUtilityItf::CalculateNumMetadataItems(TUint*numItems)
   140 TInt CMetadataUtilityItf::CalculateNumMetadataItems(TUint*numItems)
   131 {
   141     {
   132 	if(m_pS60Util)
   142     *numItems = 0;
   133 	{
   143 
   134 		return m_pS60Util->CalculateNumMetadataItems(numItems);
   144     if (m_pS60Util)
   135 	}
   145         {
   136 	else
   146         return m_pS60Util->CalculateNumMetadataItems(numItems);
   137 	{
   147         }
   138 		return m_pHXUtil->CalculateNumMetadataItems(numItems);
   148     else if (m_pHXUtil)
   139 	}
   149         {
   140 }
   150         return m_pHXUtil->CalculateNumMetadataItems(numItems);
       
   151         }
       
   152 
       
   153     return KErrNone;
       
   154     }
   141 
   155 
   142 char* CMetadataUtilityItf::GetKey(TInt index)
   156 char* CMetadataUtilityItf::GetKey(TInt index)
   143 {
   157     {
   144 	if(m_pS60Util)
   158     if (m_pS60Util)
   145 	{
   159         {
   146 		return m_pS60Util->GetKey(index);
   160         return m_pS60Util->GetKey(index);
   147 	}
   161         }
   148 	else
   162     else if (m_pHXUtil)
   149 	{
   163         {
   150 		return m_pHXUtil->GetKey(index);
   164         return m_pHXUtil->GetKey(index);
   151 	}
   165         }
   152 }
   166 
       
   167     return NULL;
       
   168     }
   153 
   169 
   154 TInt CMetadataUtilityItf::GetValueSize(TInt index)
   170 TInt CMetadataUtilityItf::GetValueSize(TInt index)
   155 {
   171     {
   156 	if(m_pS60Util)
   172     if (m_pS60Util)
   157 	{
   173         {
   158 		return m_pS60Util->GetValueSize(index);
   174         return m_pS60Util->GetValueSize(index);
   159 	}
   175         }
   160 	else
   176     else if (m_pHXUtil)
   161 	{
   177         {
   162 		return m_pHXUtil->GetValueSize(index);
   178         return m_pHXUtil->GetValueSize(index);
   163 	}
   179         }
   164 }
   180 
   165 
   181     return 0;
   166 TInt CMetadataUtilityItf::GetValue(TInt index, char* data, TInt maxLength, TInt* outSize, TInt* encodingType)
   182     }
   167 {
   183 
   168 	if(m_pS60Util)
   184 TInt CMetadataUtilityItf::GetValue(TInt index, char* data, TInt maxLength,
   169 	{
   185         TInt* outSize, TInt* encodingType)
   170 		return m_pS60Util->GetValue(index, data, maxLength, outSize, encodingType);
   186     {
   171 	}
   187     if (m_pS60Util)
   172 	else
   188         {
   173 	{
   189         return m_pS60Util->GetValue(index, data, maxLength, outSize,
   174 		return m_pHXUtil->GetValue(index, data, maxLength, outSize, encodingType);
   190                 encodingType);
   175 	}
   191         }
   176 }
   192     else if (m_pHXUtil)
       
   193         {
       
   194         return m_pHXUtil->GetValue(index, data, maxLength, outSize,
       
   195                 encodingType);
       
   196         }
       
   197 
       
   198     return 0;
       
   199     }
   177 
   200 
   178 TInt CMetadataUtilityItf::ParseSource(char* uri)
   201 TInt CMetadataUtilityItf::ParseSource(char* uri)
   179 {
   202     {
   180 	char* tempPtr = NULL;
   203     char* tempPtr = NULL;
   181  	char extension[MAX_EXTENSION_SIZE] = { 0 };
   204     char extension[MAX_EXTENSION_SIZE] =
   182   
   205         {
   183 	tempPtr = strchr(uri, (int)'.');
   206         0
   184 	strncpy(extension,tempPtr,sizeof(tempPtr));
   207         };
   185 	
   208 
   186   	for(unsigned int i=0;i<sizeof(extension);i++)
   209     tempPtr = strchr(uri, (int) '.');
   187   	{
   210     strncpy(extension, tempPtr, sizeof(tempPtr));
   188       	extension[i] = tolower(extension[i]);
   211 
   189   	}
   212     for (unsigned int i = 0; i < sizeof(extension); i++)
   190 
   213         {
   191 	//if s60 util in use
   214         extension[i] = tolower(extension[i]);
   192 	if(m_pS60Util)
   215         }
   193 	{
   216 
   194 		//reset existing instace
   217     //if s60 util in use
   195 		TInt ret = m_pS60Util->Reset();
   218     if (m_pS60Util)
   196 		if(!CS60MetadataUtilityItf::IsSupportedExtension(extension))
   219         {
   197 		{
   220         //reset existing instace
   198 			delete m_pS60Util;
   221         TInt ret = m_pS60Util->Reset();
   199 			m_pS60Util = NULL;
   222         if (!CS60MetadataUtilityItf::IsSupportedExtension(extension))
   200 		}
   223             {
   201 	}
   224             delete m_pS60Util;
   202 
   225             m_pS60Util = NULL;
   203 	if(m_pHXUtil)
   226             }
   204 	{
   227         }
   205 		//reset existing instace
   228 
   206 		TInt ret = m_pHXUtil->Reset();
   229     if (m_pHXUtil)
   207 		if(CS60MetadataUtilityItf::IsSupportedExtension(extension))
   230         {
   208 		{
   231         //reset existing instace
   209 			delete m_pHXUtil;
   232         TInt ret = m_pHXUtil->Reset();
   210 			m_pHXUtil = NULL;
   233         if (CS60MetadataUtilityItf::IsSupportedExtension(extension))
   211 		}
   234             {
   212 	}
   235             delete m_pHXUtil;
   213 
   236             m_pHXUtil = NULL;
   214 	if(!m_pS60Util && !m_pHXUtil)
   237             }
   215 	{
   238         }
   216 		
   239 
   217 		if(CS60MetadataUtilityItf::IsSupportedExtension(extension))
   240     if (!m_pS60Util && !m_pHXUtil)
   218 		{
   241         {
   219 			m_pS60Util = CS60MetadataUtilityItf::New(); 
   242 
   220 		}
   243         if (CS60MetadataUtilityItf::IsSupportedExtension(extension))
   221 		else
   244             {
   222 		{
   245             m_pS60Util = CS60MetadataUtilityItf::New();
   223 			m_pHXUtil = CHXMetadataUtilityItf::New();
   246             }
   224 		}
   247         else
   225 	}
   248             {
   226 
   249             m_pHXUtil = CHXMetadataUtilityItf::New();
   227 	return OpenSource(uri);
   250             }
   228 }
   251         }
   229 
   252 
       
   253     return OpenSource(uri);
       
   254     }
   230 
   255 
   231 bool CS60MetadataUtilityItf::IsSupportedExtension(char *extn)
   256 bool CS60MetadataUtilityItf::IsSupportedExtension(char *extn)
   232 {
   257     {
   233 	if(	(!strcasecmp(extn, ".mp3"))	|| 
   258     if ((!strcasecmp(extn, ".mp3")) || (!strcasecmp(extn, ".wma"))
   234 		(!strcasecmp(extn, ".wma"))	|| 
   259             || (!strcasecmp(extn, ".aac")) || (!strcasecmp(extn, ".wav"))
   235 		(!strcasecmp(extn, ".aac")) ||
   260             || (!strcasecmp(extn, ".m4a")))
   236 		(!strcasecmp(extn, ".wav")) ||
   261         {
   237 		(!strcasecmp(extn, ".m4a")))
   262         return true;
   238 	{
   263         }
   239 		return true;
   264 
   240 	}
   265     return false;
   241 
   266     }
   242 	return false;
       
   243 }
       
   244 
   267 
   245 CS60MetadataUtilityItf* CS60MetadataUtilityItf::New()
   268 CS60MetadataUtilityItf* CS60MetadataUtilityItf::New()
   246 {
   269     {
   247 	CS60MetadataUtilityItf* self = new CS60MetadataUtilityItf();
   270     CS60MetadataUtilityItf* self = new CS60MetadataUtilityItf();
   248 	
   271 
   249 	TInt err = KErrGeneral;
   272     TInt err = KErrGeneral;
   250 	TRAP(err, self->ConstructL());
   273     TRAP(err, self->ConstructL());
   251 
   274 
   252 	if(err == KErrNone)
   275     if (err == KErrNone)
   253 	{
   276         {
   254 		return self;
   277         return self;
   255 	}
   278         }
   256 
   279 
   257 	delete self;
   280     delete self;
   258 	return NULL;
   281     return NULL;
   259 }
   282     }
   260 
   283 
   261 CS60MetadataUtilityItf::CS60MetadataUtilityItf():pMetaDataUtility(NULL)
   284 CS60MetadataUtilityItf::CS60MetadataUtilityItf() :
   262 {
   285     pMetaDataUtility(NULL)
   263 }
   286     {
       
   287     }
   264 
   288 
   265 void CS60MetadataUtilityItf::ConstructL()
   289 void CS60MetadataUtilityItf::ConstructL()
   266 {
   290     {
   267 	TAG_TIME_PROFILING_BEGIN;
   291     TAG_TIME_PROFILING_BEGIN;
   268 	pMetaDataUtility = CMetaDataUtility::NewL();
   292     pMetaDataUtility = CMetaDataUtility::NewL();
   269 	TAG_TIME_PROFILING_END;
   293     TAG_TIME_PROFILING_END; PRINT_TO_CONSOLE_TIME_DIFF;
   270 	PRINT_TO_CONSOLE_TIME_DIFF;
   294     }
   271 }
   295 
   272     
       
   273 CS60MetadataUtilityItf::~CS60MetadataUtilityItf()
   296 CS60MetadataUtilityItf::~CS60MetadataUtilityItf()
   274 {
   297     {
   275 	if(pMetaDataUtility)
   298     if (pMetaDataUtility)
   276 	{		
   299         {
   277 		TInt err = KErrGeneral;
   300         TInt err = KErrGeneral;
   278 		
   301 
   279 		TAG_TIME_PROFILING_BEGIN;
   302         TAG_TIME_PROFILING_BEGIN;
   280 		TRAP(err, pMetaDataUtility->ResetL());
   303         TRAP(err, pMetaDataUtility->ResetL());
   281 		delete pMetaDataUtility;
   304         delete pMetaDataUtility;
   282 		TAG_TIME_PROFILING_END;
   305         TAG_TIME_PROFILING_END; PRINT_TO_CONSOLE_TIME_DIFF;
   283 		PRINT_TO_CONSOLE_TIME_DIFF;
   306         }
   284 	}
   307 
   285 
   308     pMetaDataUtility = NULL;
   286 	pMetaDataUtility = NULL;
   309     }
   287 }
       
   288 
   310 
   289 TInt CS60MetadataUtilityItf::ParseSource(TDesC& fileName)
   311 TInt CS60MetadataUtilityItf::ParseSource(TDesC& fileName)
   290 {
   312     {
   291 	TInt err = KErrGeneral;
   313     TInt err = KErrGeneral;
   292 
   314 
   293 	if(pMetaDataUtility)
   315     if (pMetaDataUtility)
   294 	{
   316         {
   295 	
   317 
   296 		TAG_TIME_PROFILING_BEGIN;
   318         TAG_TIME_PROFILING_BEGIN;
   297 		//open with the file handle
   319         //open with the file handle
   298 		TRAP(err, pMetaDataUtility->OpenFileL(fileName));
   320         TRAP(err, pMetaDataUtility->OpenFileL(fileName)); 
   299 		TAG_TIME_PROFILING_END;
   321         TAG_TIME_PROFILING_END; 
   300 		PRINT_TO_CONSOLE_TIME_DIFF;
   322         PRINT_TO_CONSOLE_TIME_DIFF;
   301 
   323 
   302 		if(err == KErrNone)
   324         if (err == KErrNone)
   303 		{
   325             {
   304 			uNumMetadataItems = pMetaDataUtility->MetaDataCount();
   326             uNumMetadataItems = pMetaDataUtility->MetaDataCount();
   305 		}
   327             }
   306 	}
   328         }
   307 
   329 
   308 	return err;
   330     return err;
   309 }
   331     }
   310 
   332 
   311 TInt CS60MetadataUtilityItf::CalculateNumMetadataItems(TUint* numItems)
   333 TInt CS60MetadataUtilityItf::CalculateNumMetadataItems(TUint* numItems)
   312 {
   334     {
   313 	TInt err = KErrGeneral;
   335     TInt err = KErrGeneral;
   314 
   336 
   315 	if(pMetaDataUtility && numItems)
   337     if (pMetaDataUtility && numItems)
   316 	{
   338         {
   317 		*numItems = uNumMetadataItems;
   339         *numItems = uNumMetadataItems;
   318 		err = KErrNone;
   340         err = KErrNone;
   319 	}
   341         }
   320 
   342 
   321 	return err;
   343     return err;
   322 }
   344     }
   323 
   345 
   324 char* CS60MetadataUtilityItf::KeyMapping(TMetaDataFieldId fldID)
   346 char* CS60MetadataUtilityItf::KeyMapping(TMetaDataFieldId fldID)
   325 {
   347     {
   326 	switch(fldID)
   348     switch (fldID)
   327 	{
   349         {
   328 	
   350 
   329 		case EMetaDataSongTitle:
   351         case EMetaDataSongTitle:
   330 		{
   352             {
   331 			return "KhronosTitle";
   353             return "KhronosTitle";
   332 		}
   354             }
   333 		case EMetaDataArtist:
   355         case EMetaDataArtist:
   334 		{
   356             {
   335 			return "KhronosArtist";
   357             return "KhronosArtist";
   336 		}
   358             }
   337 		case EMetaDataAlbum:
   359         case EMetaDataAlbum:
   338 		{
   360             {
   339 			return "KhronosAlbum";
   361             return "KhronosAlbum";
   340 		}
   362             }
   341 		case EMetaDataYear:
   363         case EMetaDataYear:
   342 		{
   364             {
   343 			return "KhronosYear";
   365             return "KhronosYear";
   344 		}
   366             }
   345 		case EMetaDataComment:
   367         case EMetaDataComment:
   346 		{
   368             {
   347 			return "KhronosComment";
   369             return "KhronosComment";
   348 		}
   370             }
   349 		case EMetaDataAlbumTrack:
   371         case EMetaDataAlbumTrack:
   350 		{
   372             {
   351 			return "KhronosTrackNumber";
   373             return "KhronosTrackNumber";
   352 		}
   374             }
   353 		case EMetaDataGenre:
   375         case EMetaDataGenre:
   354 		{
   376             {
   355 			return "KhronosGenre";
   377             return "KhronosGenre";
   356 		}
   378             }
   357 		case EMetaDataComposer:
   379         case EMetaDataComposer:
   358 		{
   380             {
   359 			return "Composer"; //Non Standard
   381             return "Composer"; //Non Standard
   360 		}
   382             }
   361 		case EMetaDataCopyright:
   383         case EMetaDataCopyright:
   362 		{
   384             {
   363 			return "KhronosCopyright";
   385             return "KhronosCopyright";
   364 		}
   386             }
   365 		case EMetaDataOriginalArtist:
   387         case EMetaDataOriginalArtist:
   366 		{
   388             {
   367 			return "Original Artist"; //Non Standard
   389             return "Original Artist"; //Non Standard
   368 		}
   390             }
   369 		case EMetaDataUserUrl:
   391         case EMetaDataUserUrl:
   370 		case EMetaDataUrl:	   
   392         case EMetaDataUrl:
   371 		{
   393             {
   372 			return "KhronosContentURL";
   394             return "KhronosContentURL";
   373 		}
   395             }
   374 		case EMetaDataJpeg:
   396         case EMetaDataJpeg:
   375 		{
   397             {
   376 			return "attachedpicture";//"KhronosAlbumArtJPEG";
   398             return "attachedpicture";//"KhronosAlbumArtJPEG";
   377 		}
   399             }
   378 		case EMetaDataVendor:
   400         case EMetaDataVendor:
   379 		{
   401             {
   380 			return "Vendor"; //Non Standard
   402             return "Vendor"; //Non Standard
   381 		}
   403             }
   382 		case EMetaDataRating:
   404         case EMetaDataRating:
   383 		{
   405             {
   384 			return "KhronosRating";			
   406             return "KhronosRating";
   385 		}
   407             }
   386 		case EMetaDataDuration:
   408         case EMetaDataDuration:
   387 		{
   409             {
   388 			return "Duration"; //Non Standard
   410             return "Duration"; //Non Standard
   389 		}
   411             }
   390 		default:
   412         default:
   391 		{
   413             {
   392 		}
   414             }
   393 	} 
   415         }
   394 
   416 
   395 	return "UnSupported";
   417     return "UnSupported";
   396 }
   418     }
   397 
   419 
   398 TInt CS60MetadataUtilityItf::ValueEncoding(TMetaDataFieldId fldID)
   420 TInt CS60MetadataUtilityItf::ValueEncoding(TMetaDataFieldId fldID)
   399 {
   421     {
   400 	switch(fldID)
   422     switch (fldID)
   401 	{
   423         {
   402 		case EMetaDataJpeg:
   424         case EMetaDataJpeg:
   403 		{
   425             {
   404 			return CMetadataUtilityItf::EBinaryEncoding;
   426             return CMetadataUtilityItf::EBinaryEncoding;
   405 		}
   427             }
   406 		
   428 
   407 		case EMetaDataSongTitle:
   429         case EMetaDataSongTitle:
   408 		case EMetaDataArtist:
   430         case EMetaDataArtist:
   409 		case EMetaDataAlbum:
   431         case EMetaDataAlbum:
   410 		case EMetaDataYear:
   432         case EMetaDataYear:
   411 		case EMetaDataComment:
   433         case EMetaDataComment:
   412 		case EMetaDataAlbumTrack:
   434         case EMetaDataAlbumTrack:
   413 		case EMetaDataGenre:
   435         case EMetaDataGenre:
   414 		case EMetaDataComposer:
   436         case EMetaDataComposer:
   415 		case EMetaDataCopyright:
   437         case EMetaDataCopyright:
   416 		case EMetaDataOriginalArtist:
   438         case EMetaDataOriginalArtist:
   417 		case EMetaDataUserUrl:
   439         case EMetaDataUserUrl:
   418 		case EMetaDataUrl:
   440         case EMetaDataUrl:
   419 		case EMetaDataVendor:
   441         case EMetaDataVendor:
   420 		case EMetaDataRating:
   442         case EMetaDataRating:
   421 		case EMetaDataDuration:
   443         case EMetaDataDuration:
   422 		default:
   444         default:
   423 		{
   445             {
   424 			return CMetadataUtilityItf::EUnicodeEncoding;
   446             return CMetadataUtilityItf::EUnicodeEncoding;
   425 		}
   447             }
   426 	}
   448         }
   427 	
   449 
   428 }
   450     }
   429 char* CS60MetadataUtilityItf::GetKey(TInt index)
   451 char* CS60MetadataUtilityItf::GetKey(TInt index)
   430 {
   452     {
   431 
   453 
   432 	if(pMetaDataUtility && index < uNumMetadataItems)
   454     if (pMetaDataUtility && index < uNumMetadataItems)
   433 	{
   455         {
   434 		
   456 
   435         TMetaDataFieldId fieldId; 
   457         TMetaDataFieldId fieldId;
   436 		
   458 
   437 		TAG_TIME_PROFILING_BEGIN;
   459         TAG_TIME_PROFILING_BEGIN;
   438 		TInt err = KErrGeneral;
   460         TInt err = KErrGeneral;
   439 		TRAP(err, pMetaDataUtility->MetaDataFieldsL().FieldIdAt( index, fieldId ));
   461         TRAP(err, pMetaDataUtility->MetaDataFieldsL().FieldIdAt( index, fieldId )); 
   440 		TAG_TIME_PROFILING_END;
   462         TAG_TIME_PROFILING_END; 
   441 		PRINT_TO_CONSOLE_TIME_DIFF;
   463         PRINT_TO_CONSOLE_TIME_DIFF;
   442 		
   464 
   443 		if((err == KErrNone) && (fieldId != EUnknownMetaDataField))
   465         if ((err == KErrNone) && (fieldId != EUnknownMetaDataField))
   444 		{
   466             {
   445 			return KeyMapping(fieldId);
   467             return KeyMapping(fieldId);
   446 		}
   468             }
   447 	}
   469         }
   448 	return NULL;
   470     return NULL;
   449 }
   471     }
   450 
   472 
   451 TInt CS60MetadataUtilityItf::GetValueSize(TInt index)
   473 TInt CS60MetadataUtilityItf::GetValueSize(TInt index)
   452 {
   474     {
   453 	if(pMetaDataUtility && index < uNumMetadataItems)
   475     if (pMetaDataUtility && index < uNumMetadataItems)
   454 	{
   476         {
   455 		
   477 
   456         TMetaDataFieldId fieldId; 
   478         TMetaDataFieldId fieldId;
   457 		TInt err = KErrGeneral;
   479         TInt err = KErrGeneral;
   458 		TRAP(err, pMetaDataUtility->MetaDataFieldsL().FieldIdAt( index, fieldId ));
   480         TRAP(err, pMetaDataUtility->MetaDataFieldsL().FieldIdAt( index, fieldId ));
   459 
   481 
   460 		if((err == KErrNone) && (fieldId != EUnknownMetaDataField))
   482         if ((err == KErrNone) && (fieldId != EUnknownMetaDataField))
   461 		{
   483             {
   462 			const CMetaDataFieldContainer* iContainer = NULL;
   484             const CMetaDataFieldContainer* iContainer = NULL;
   463 			TRAP(err, iContainer  = &pMetaDataUtility->MetaDataFieldsL());
   485             TRAP(err, iContainer = &pMetaDataUtility->MetaDataFieldsL());
   464 			if(err == KErrNone)
   486             if (err == KErrNone)
   465 			{
   487                 {
   466 				if(ValueEncoding(fieldId) == CMetadataUtilityItf::EUnicodeEncoding)
   488                 if (ValueEncoding(fieldId)
   467 				{
   489                         == CMetadataUtilityItf::EUnicodeEncoding)
   468 					TPtrC field = iContainer->Field( fieldId ); 
   490                     {
   469 					if(field != KNullDesC)
   491                     TPtrC field = iContainer->Field(fieldId);
   470 					{
   492                     if (field != KNullDesC)
   471 						return field.Size() + 2; //additional character (two bytes) for null terminator
   493                         {
   472 					}
   494                         return field.Size() + 2; //additional character (two bytes) for null terminator
   473 				}	
   495                         }
   474 				else //Binary
   496                     }
   475 				{
   497                 else //Binary
   476 					TPtrC8 field8 = iContainer->Field8( fieldId );
   498                     {
   477 					if(field8 != KNullDesC8)
   499                     TPtrC8 field8 = iContainer->Field8(fieldId);
   478 					{
   500                     if (field8 != KNullDesC8)
   479 						return field8.Size();
   501                         {
   480 					}
   502                         return field8.Size();
   481 		        }
   503                         }
   482 			}
   504                     }
   483 		}
   505                 }
   484 	}
   506             }
   485 
   507         }
   486 	return 0;
   508 
   487 }
   509     return 0;
   488 	
   510     }
   489 TInt CS60MetadataUtilityItf::GetValue(TInt index, char* data, TInt maxLength,  //in params
   511 
   490 										TInt* outSize, TInt* encodingType) //out params
   512 TInt CS60MetadataUtilityItf::GetValue(TInt index, char* data, TInt maxLength, //in params
   491 {
   513         TInt* outSize, TInt* encodingType) //out params
   492 
   514     {
   493 	TInt retValueSize = 0;
   515 
   494 	*encodingType= CMetadataUtilityItf::EUnknownEncoding;
   516     TInt retValueSize = 0;
   495 
   517     *encodingType = CMetadataUtilityItf::EUnknownEncoding;
   496 	if(pMetaDataUtility && index < uNumMetadataItems)
   518 
   497 	{
   519     if (pMetaDataUtility && index < uNumMetadataItems)
   498 		
   520         {
   499         TMetaDataFieldId fieldId; 
   521 
   500 		TInt err = KErrGeneral;
   522         TMetaDataFieldId fieldId;
   501 		TRAP(err, pMetaDataUtility->MetaDataFieldsL().FieldIdAt( index, fieldId )); 
   523         TInt err = KErrGeneral;
   502 		
   524         TRAP(err, pMetaDataUtility->MetaDataFieldsL().FieldIdAt( index, fieldId ));
   503 		
   525 
   504 		if((err==KErrNone) && (fieldId != EUnknownMetaDataField))
   526         if ((err == KErrNone) && (fieldId != EUnknownMetaDataField))
   505 		{
   527             {
   506 		
   528 
   507 			const CMetaDataFieldContainer* iContainer = NULL;
   529             const CMetaDataFieldContainer* iContainer = NULL;
   508 			TRAP(err, iContainer  = &pMetaDataUtility->MetaDataFieldsL());
   530             TRAP(err, iContainer = &pMetaDataUtility->MetaDataFieldsL());
   509 			if(err == KErrNone)
   531             if (err == KErrNone)
   510 			{
   532                 {
   511 				*encodingType = ValueEncoding(fieldId);
   533                 *encodingType = ValueEncoding(fieldId);
   512 				if(*encodingType == CMetadataUtilityItf::EUnicodeEncoding)
   534                 if (*encodingType == CMetadataUtilityItf::EUnicodeEncoding)
   513 				{
   535                     {
   514 				
   536 
   515 					
   537                     TAG_TIME_PROFILING_BEGIN;
   516 					TAG_TIME_PROFILING_BEGIN;
   538                     TPtrC field = iContainer->Field(fieldId);
   517 					TPtrC field = iContainer->Field( fieldId ); 
   539                     TAG_TIME_PROFILING_END;
   518 					TAG_TIME_PROFILING_END;
   540                     PRINT_TO_CONSOLE_TIME_DIFF;
   519 					PRINT_TO_CONSOLE_TIME_DIFF;
   541                     if (field != KNullDesC)
   520 					if(field != KNullDesC)
   542                         {
   521 					{
   543                         *outSize = CMetadataUtilityItf::ExtractUCS2(field,
   522 						*outSize = CMetadataUtilityItf::ExtractUCS2(field, data, maxLength);
   544                                 data, maxLength);
   523 						retValueSize = field.Size() + 2; //actual size
   545                         retValueSize = field.Size() + 2; //actual size
   524 					}
   546                         }
   525 				}	
   547                     }
   526 				else //Binary
   548                 else //Binary
   527 				{
   549                     {
   528 					
   550 
   529 					TAG_TIME_PROFILING_BEGIN;
   551                     TAG_TIME_PROFILING_BEGIN;
   530 					TPtrC8 field8 = iContainer->Field8( fieldId ); 
   552                     TPtrC8 field8 = iContainer->Field8(fieldId);
   531 					TAG_TIME_PROFILING_END;
   553                     TAG_TIME_PROFILING_END;
   532 					PRINT_TO_CONSOLE_TIME_DIFF;
   554                     PRINT_TO_CONSOLE_TIME_DIFF;
   533 					if(field8 != KNullDesC8)
   555                     if (field8 != KNullDesC8)
   534 					{
   556                         {
   535 						*outSize = (maxLength > field8.Size())?field8.Size():maxLength;					
   557                         *outSize
   536 						memcpy(data, field8.Ptr(), *outSize);
   558                                 = (maxLength > field8.Size())
   537 						retValueSize = field8.Size();					
   559                                                               ? field8.Size()
   538 					}
   560                                                                  : maxLength;
   539 				}
   561                         memcpy(data, field8.Ptr(), *outSize);
   540 			}
   562                         retValueSize = field8.Size();
   541 		}
   563                         }
   542 	}
   564                     }
   543 
   565                 }
   544 	return	 retValueSize;
   566             }
   545 }
   567         }
       
   568 
       
   569     return retValueSize;
       
   570     }
   546 
   571 
   547 TInt CS60MetadataUtilityItf::Reset()
   572 TInt CS60MetadataUtilityItf::Reset()
   548 {
   573     {
   549 	TInt err = KErrNone;	
   574     TInt err = KErrNone;
   550 	if(pMetaDataUtility)
   575     if (pMetaDataUtility)
   551 	{		
   576         {
   552 		TRAP(err, pMetaDataUtility->ResetL());
   577         TRAP(err, pMetaDataUtility->ResetL());
   553 	}
   578         }
   554 
   579 
   555 	return err;
   580     return err;
   556 }
   581     }
   557 
   582 
   558 
   583 CHXMetadataUtilityItf::CHXMetadataUtilityItf() :
   559 CHXMetadataUtilityItf::CHXMetadataUtilityItf():pHXMetaDataUtility(NULL)
   584     pHXMetaDataUtility(NULL)
   560 {
   585     {
   561 }
   586     }
   562 
   587 
   563 void CHXMetadataUtilityItf::ConstructL()
   588 void CHXMetadataUtilityItf::ConstructL()
   564 {
   589     {
   565 	TAG_TIME_PROFILING_BEGIN;
   590     TAG_TIME_PROFILING_BEGIN;
   566 	pHXMetaDataUtility = CHXMetaDataUtility::NewL();
   591     pHXMetaDataUtility = CHXMetaDataUtility::NewL();
   567 	TAG_TIME_PROFILING_END;
   592     TAG_TIME_PROFILING_END; 
   568 	PRINT_TO_CONSOLE_TIME_DIFF;
   593     PRINT_TO_CONSOLE_TIME_DIFF;
   569 }
   594     }
   570 
   595 
   571    
       
   572 CHXMetadataUtilityItf* CHXMetadataUtilityItf::New()
   596 CHXMetadataUtilityItf* CHXMetadataUtilityItf::New()
   573 {
   597     {
   574 	CHXMetadataUtilityItf* self = new CHXMetadataUtilityItf();
   598     CHXMetadataUtilityItf* self = new CHXMetadataUtilityItf();
   575 
   599 
   576 	if(self)
   600     if (self)
   577 	{
   601         {
   578 		TInt err = KErrGeneral;
   602         TInt err = KErrGeneral;
   579 		TRAP(err, self->ConstructL());
   603         TRAP(err, self->ConstructL());
   580    
   604 
   581 		if(err != KErrNone)
   605         if (err != KErrNone)
   582 		{
   606             {
   583 			delete self;
   607             delete self;
   584 			self = NULL;
   608             self = NULL;
   585 		}
   609             }
   586 	}
   610         }
   587    
   611 
   588 	return self;
   612     return self;
   589 }
   613     }
   590    
   614 
   591 CHXMetadataUtilityItf::~CHXMetadataUtilityItf()
   615 CHXMetadataUtilityItf::~CHXMetadataUtilityItf()
   592 {
   616     {
   593 	if(pHXMetaDataUtility)
   617     if (pHXMetaDataUtility)
   594 	{		
   618         {
   595 		TInt err = KErrGeneral;
   619         TInt err = KErrGeneral;
   596 		
   620 
   597 		TAG_TIME_PROFILING_BEGIN;
   621         TAG_TIME_PROFILING_BEGIN;
   598 		TRAP(err, pHXMetaDataUtility->ResetL());
   622         TRAP(err, pHXMetaDataUtility->ResetL());
   599 		delete pHXMetaDataUtility;
   623         delete pHXMetaDataUtility;
   600 		TAG_TIME_PROFILING_END;
   624         TAG_TIME_PROFILING_END; 
   601 		PRINT_TO_CONSOLE_TIME_DIFF;
   625         PRINT_TO_CONSOLE_TIME_DIFF;
   602 	}
   626         }
   603 
   627 
   604 	pHXMetaDataUtility = NULL;
   628     pHXMetaDataUtility = NULL;
   605 }
   629     }
   606 
   630 
   607 TInt CHXMetadataUtilityItf::Reset()
   631 TInt CHXMetadataUtilityItf::Reset()
   608 {
   632     {
   609 	TInt err = KErrNone;	
   633     TInt err = KErrNone;
   610 	if(pHXMetaDataUtility)
   634     if (pHXMetaDataUtility)
   611 	{		
   635         {
   612 		TRAP(err, pHXMetaDataUtility->ResetL());
   636         TRAP(err, pHXMetaDataUtility->ResetL());
   613 	}
   637         }
   614 
   638 
   615 	return err;
   639     return err;
   616 }
   640     }
   617 
       
   618 
       
   619 
   641 
   620 TInt CHXMetadataUtilityItf::ParseSource(TDesC& fileName)
   642 TInt CHXMetadataUtilityItf::ParseSource(TDesC& fileName)
   621 {
   643     {
   622 	TInt err = KErrGeneral;
   644     TInt err = KErrGeneral;
   623 
   645 
   624 	if(pHXMetaDataUtility)
   646     if (pHXMetaDataUtility)
   625 	{
   647         {
   626 		//open with the file handle
   648         //open with the file handle
   627 		TAG_TIME_PROFILING_BEGIN;
   649         TAG_TIME_PROFILING_BEGIN;
   628 		TRAP(err, pHXMetaDataUtility->OpenFileL(fileName));
   650         TRAP(err, pHXMetaDataUtility->OpenFileL(fileName)); 
   629 		TAG_TIME_PROFILING_END;
   651         TAG_TIME_PROFILING_END; 
   630 		PRINT_TO_CONSOLE_TIME_DIFF;
   652         PRINT_TO_CONSOLE_TIME_DIFF;
   631 
   653 
   632 		if(err == KErrNone)
   654         if (err == KErrNone)
   633 		{
   655             {
   634 			 return pHXMetaDataUtility->GetMetaDataCount(uNumMetadataItems);
   656             return pHXMetaDataUtility->GetMetaDataCount(uNumMetadataItems);
   635 		}
   657             }
   636 	}
   658         }
   637 
   659 
   638 	return err;
   660     return err;
   639 }
   661     }
   640 
   662 
   641 TInt CHXMetadataUtilityItf::CalculateNumMetadataItems(TUint* numItems)
   663 TInt CHXMetadataUtilityItf::CalculateNumMetadataItems(TUint* numItems)
   642 {
   664     {
   643 	TInt err = KErrGeneral;
   665     TInt err = KErrGeneral;
   644 
   666 
   645 	if(pHXMetaDataUtility && numItems)
   667     if (pHXMetaDataUtility && numItems)
   646 	{
   668         {
   647 		*numItems = uNumMetadataItems;
   669         *numItems = uNumMetadataItems;
   648 		err = KErrNone;
   670         err = KErrNone;
   649 	}
   671         }
   650 
   672 
   651 	return err;
   673     return err;
   652 }
   674     }
   653 
   675 
   654 char* CHXMetadataUtilityItf::KeyMapping(HXMetaDataKeys::EHXMetaDataId fldID)
   676 char* CHXMetadataUtilityItf::KeyMapping(HXMetaDataKeys::EHXMetaDataId fldID)
   655 {
   677     {
   656         
   678 
   657 	switch(fldID)
   679     switch (fldID)
   658 	{
   680         {
   659 	
   681 
   660 		case HXMetaDataKeys::EHXTitle:
   682         case HXMetaDataKeys::EHXTitle:
   661 		{
   683             {
   662 			return "KhronosTitle";
   684             return "KhronosTitle";
   663 		}
   685             }
   664 		case HXMetaDataKeys::EHXPerformer:
   686         case HXMetaDataKeys::EHXPerformer:
   665 		{
   687             {
   666 			return "KhronosArtist";
   688             return "KhronosArtist";
   667 		}
   689             }
   668 		case HXMetaDataKeys::EHXDescription:
   690         case HXMetaDataKeys::EHXDescription:
   669 		{
   691             {
   670 			return "KhronosComment";
   692             return "KhronosComment";
   671 		}
   693             }
   672 		case HXMetaDataKeys::EHXGenre:
   694         case HXMetaDataKeys::EHXGenre:
   673 		{
   695             {
   674 			return "KhronosGenre";
   696             return "KhronosGenre";
   675 		}
   697             }
   676 		case HXMetaDataKeys::EHXAuthor:
   698         case HXMetaDataKeys::EHXAuthor:
   677 		{
   699             {
   678 			return "Composer"; //Non Standard
   700             return "Composer"; //Non Standard
   679 		}
   701             }
   680 		case HXMetaDataKeys::EHXCopyright:
   702         case HXMetaDataKeys::EHXCopyright:
   681 		{
   703             {
   682 			return "KhronosCopyright";
   704             return "KhronosCopyright";
   683 		}
   705             }
   684 		case HXMetaDataKeys::EHXContentURI:	   
   706         case HXMetaDataKeys::EHXContentURI:
   685 		{
   707             {
   686 			return "KhronosContentURL";
   708             return "KhronosContentURL";
   687 		}
   709             }
   688 		case HXMetaDataKeys::EHXDuration:
   710         case HXMetaDataKeys::EHXDuration:
   689 		{
   711             {
   690 			return "Duration"; //Non Standard
   712             return "Duration"; //Non Standard
   691 		}
   713             }
   692 		case HXMetaDataKeys::EHXClipBitRate:
   714         case HXMetaDataKeys::EHXClipBitRate:
   693 		{
   715             {
   694 			return "ClipBitRate"; //non-standard
   716             return "ClipBitRate"; //non-standard
   695 		}
   717             }
   696 		case HXMetaDataKeys::EHXVideoBitRate:
   718         case HXMetaDataKeys::EHXVideoBitRate:
   697 		{
   719             {
   698 			return "VideoBitRate"; // non-standard
   720             return "VideoBitRate"; // non-standard
   699 		}
   721             }
   700 		case HXMetaDataKeys::EHXAudioBitRate:
   722         case HXMetaDataKeys::EHXAudioBitRate:
   701 		{
   723             {
   702 			return "AudioBitRate";
   724             return "AudioBitRate";
   703 		}
   725             }
   704 		case HXMetaDataKeys::EHXCodec:
   726         case HXMetaDataKeys::EHXCodec:
   705 		{
   727             {
   706 			return "Codec";
   728             return "Codec";
   707 		}
   729             }
   708 		case HXMetaDataKeys::EHXFrameSize:
   730         case HXMetaDataKeys::EHXFrameSize:
   709 		{
   731             {
   710 			return "Resolution";
   732             return "Resolution";
   711 		}
   733             }
   712 		case HXMetaDataKeys::EHXFramesPerSecond:
   734         case HXMetaDataKeys::EHXFramesPerSecond:
   713 		{
   735             {
   714 			return "FrameRate";
   736             return "FrameRate";
   715 		}
   737             }
   716 		case HXMetaDataKeys::EHXStreamCount:
   738         case HXMetaDataKeys::EHXStreamCount:
   717 		{
   739             {
   718 			return "Stream Count";
   740             return "Stream Count";
   719 		}
   741             }
   720 		case HXMetaDataKeys::EHXLiveStream:
   742         case HXMetaDataKeys::EHXLiveStream:
   721 		{
   743             {
   722 			return "Live Stream";
   744             return "Live Stream";
   723 		}
   745             }
   724         case HXMetaDataKeys::EHXSeekable:
   746         case HXMetaDataKeys::EHXSeekable:
   725 		{
   747             {
   726 			return "Seekable";
   748             return "Seekable";
   727 		}
   749             }
   728         case HXMetaDataKeys::EHXContentType:
   750         case HXMetaDataKeys::EHXContentType:
   729   		{
   751             {
   730 			return "Content Type";
   752             return "Content Type";
   731 		}
   753             }
   732 		case HXMetaDataKeys::EHXFormat:
   754         case HXMetaDataKeys::EHXFormat:
   733 		{
   755             {
   734 			return "Format";
   756             return "Format";
   735 		}
   757             }
   736         case HXMetaDataKeys::EHXQuality:
   758         case HXMetaDataKeys::EHXQuality:
   737 		{
   759             {
   738 			return "Quality";
   760             return "Quality";
   739 		}
   761             }
   740         case HXMetaDataKeys::EHXAbstract:
   762         case HXMetaDataKeys::EHXAbstract:
   741 		{
   763             {
   742 			return "Abstract";
   764             return "Abstract";
   743 		}
   765             }
   744 		case HXMetaDataKeys::EHXMimeType:
   766         case HXMetaDataKeys::EHXMimeType:
   745 		{
   767             {
   746 			return "MimeType";
   768             return "MimeType";
   747 		}
   769             }
   748 		case HXMetaDataKeys::EHXIconURI:
   770         case HXMetaDataKeys::EHXIconURI:
   749 		{
   771             {
   750 			return "Icon URI";
   772             return "Icon URI";
   751 		}
   773             }
   752         case HXMetaDataKeys::EHXEPreviewURI:
   774         case HXMetaDataKeys::EHXEPreviewURI:
   753 		{
   775             {
   754 			return "Preview URI";
   776             return "Preview URI";
   755 		}
   777             }
   756         case HXMetaDataKeys::EHXContentID:
   778         case HXMetaDataKeys::EHXContentID:
   757 		{
   779             {
   758 			return "Content ID";
   780             return "Content ID";
   759 		}
   781             }
   760         case HXMetaDataKeys::EHXInfoURL:
   782         case HXMetaDataKeys::EHXInfoURL:
   761 		{
   783             {
   762 			return "Info URL";
   784             return "Info URL";
   763 		}
   785             }
   764 		default:
   786         default:
   765 		{
   787             {
   766 		}
   788             }
   767 	} 
   789         }
   768 
   790 
   769 	return "UnSupported";
   791     return "UnSupported";
   770 }
   792     }
   771 
   793 
   772 TInt CHXMetadataUtilityItf::ValueEncoding(HXMetaDataKeys::EHXMetaDataId fldID)
   794 TInt CHXMetadataUtilityItf::ValueEncoding(HXMetaDataKeys::EHXMetaDataId fldID)
   773 {
   795     {
   774 	switch(fldID)
   796     switch (fldID)
   775 	{
   797         {
   776 		default:
   798         default:
   777 		{
   799             {
   778 			return CMetadataUtilityItf::EUnicodeEncoding;
   800             return CMetadataUtilityItf::EUnicodeEncoding;
   779 		}
   801             }
   780 	}
   802         }
   781 	
   803 
   782 }
   804     }
   783 char* CHXMetadataUtilityItf::GetKey(TInt index)
   805 char* CHXMetadataUtilityItf::GetKey(TInt index)
   784 {
   806     {
   785 
   807 
   786 	if(pHXMetaDataUtility && index < uNumMetadataItems)
   808     if (pHXMetaDataUtility && index < uNumMetadataItems)
   787 	{
   809         {
   788 		HXMetaDataKeys::EHXMetaDataId id;
   810         HXMetaDataKeys::EHXMetaDataId id;
   789 		HBufC* pDes;
   811         HBufC* pDes;
   790 		
   812 
   791 		TAG_TIME_PROFILING_BEGIN;
   813         TAG_TIME_PROFILING_BEGIN;
   792         TInt err = pHXMetaDataUtility->GetMetaDataAt(index, id, pDes); 
   814         TInt err = pHXMetaDataUtility->GetMetaDataAt(index, id, pDes);
   793 		TAG_TIME_PROFILING_END;
   815         TAG_TIME_PROFILING_END; 
   794 		PRINT_TO_CONSOLE_TIME_DIFF;
   816         PRINT_TO_CONSOLE_TIME_DIFF;
   795 		
   817 
   796 		if(err == KErrNone)
   818         if (err == KErrNone)
   797 		{
   819             {
   798 			return KeyMapping(id);
   820             return KeyMapping(id);
   799 		}
   821             }
   800 	}
   822         }
   801 	return NULL;
   823     return NULL;
   802 }
   824     }
   803 
   825 
   804 TInt CHXMetadataUtilityItf::GetValueSize(TInt index)
   826 TInt CHXMetadataUtilityItf::GetValueSize(TInt index)
   805 {
   827     {
   806 	if(pHXMetaDataUtility && index < uNumMetadataItems)
   828     if (pHXMetaDataUtility && index < uNumMetadataItems)
   807 	{
   829         {
   808 		HXMetaDataKeys::EHXMetaDataId id;
   830         HXMetaDataKeys::EHXMetaDataId id;
   809 		HBufC* pDes;
   831         HBufC* pDes;
   810 		
   832 
   811         TInt err =  pHXMetaDataUtility->GetMetaDataAt(index, id, pDes); 
   833         TInt err = pHXMetaDataUtility->GetMetaDataAt(index, id, pDes);
   812 		
   834 
   813 		if(err == KErrNone)
   835         if (err == KErrNone)
   814 		{
   836             {
   815 			if(ValueEncoding(id) == CMetadataUtilityItf::EUnicodeEncoding)
   837             if (ValueEncoding(id) == CMetadataUtilityItf::EUnicodeEncoding)
   816 			{
   838                 {
   817 				return pDes->Size() + 2; //additional character (two bytes) for null terminator
   839                 return pDes->Size() + 2; //additional character (two bytes) for null terminator
   818 			}	
   840                 }
   819 			else //Binary
   841             else //Binary
   820 			{
   842                 {
   821 				//no support
   843                 //no support
   822 	        }
   844                 }
   823 		}
   845             }
   824 	}
   846         }
   825 
   847 
   826 	return 0;
   848     return 0;
   827 }
   849     }
   828 	
   850 
   829 TInt CHXMetadataUtilityItf::GetValue(TInt index, char* data, TInt maxLength,  //in params
   851 TInt CHXMetadataUtilityItf::GetValue(TInt index, char* data, TInt maxLength, //in params
   830 										TInt* outSize, TInt* encodingType) //out params
   852         TInt* outSize, TInt* encodingType) //out params
   831 {
   853     {
   832 
   854 
   833 	TInt retValueSize = 0;
   855     TInt retValueSize = 0;
   834 	*encodingType= CMetadataUtilityItf::EUnknownEncoding;
   856     *encodingType = CMetadataUtilityItf::EUnknownEncoding;
   835 
   857 
   836 	if(pHXMetaDataUtility && index < uNumMetadataItems)
   858     if (pHXMetaDataUtility && index < uNumMetadataItems)
   837 	{
   859         {
   838 		HXMetaDataKeys::EHXMetaDataId id;
   860         HXMetaDataKeys::EHXMetaDataId id;
   839 		HBufC* pDes;
   861         HBufC* pDes;
   840 
   862 
   841 		
   863         TAG_TIME_PROFILING_BEGIN;
   842 		TAG_TIME_PROFILING_BEGIN;
   864         TInt err = pHXMetaDataUtility->GetMetaDataAt(index, id, pDes);
   843         TInt err =  pHXMetaDataUtility->GetMetaDataAt(index, id, pDes); 
   865         TAG_TIME_PROFILING_END; 
   844 		TAG_TIME_PROFILING_END;
   866         PRINT_TO_CONSOLE_TIME_DIFF;
   845 		PRINT_TO_CONSOLE_TIME_DIFF;
   867 
   846 		
   868         *encodingType = ValueEncoding(id);
   847 		*encodingType = ValueEncoding(id);
   869 
   848 		
   870         if (err == KErrNone)
   849 		if(err == KErrNone)
   871             {
   850 		{
   872             if (*encodingType == CMetadataUtilityItf::EUnicodeEncoding)
   851 			if(*encodingType == CMetadataUtilityItf::EUnicodeEncoding)
   873                 {
   852 			{
   874                 *outSize = CMetadataUtilityItf::ExtractUCS2(*pDes, data,
   853 				*outSize = CMetadataUtilityItf::ExtractUCS2(*pDes, data, maxLength);
   875                         maxLength);
   854 				retValueSize = pDes->Size() + 2; //actual Size	
   876                 retValueSize = pDes->Size() + 2; //actual Size	
   855 			}	
   877                 }
   856 			else //Binary
   878             else //Binary
   857 			{
   879                 {
   858 				//no support
   880                 //no support
   859 			}
   881                 }
   860 		}
   882             }
   861 	}
   883         }
   862 
   884 
   863 	return	 retValueSize;
   885     return retValueSize;
   864 }
   886     }
   865 
   887 
   866 
   888 extern "C"
   867 extern "C" {
   889     {
   868 
   890 
   869     void* mmf_metadata_utility_init(char* uri)
   891     void* mmf_metadata_utility_init(char* uri)
   870 	{
   892         {
   871 		return CMetadataUtilityItf::New(uri);
   893         return CMetadataUtilityItf::New(uri);
   872 	}
   894         }
   873 
   895 
   874     void mmf_metadata_utility_destroy(void* context)
   896     void mmf_metadata_utility_destroy(void* context)
   875 	{
   897         {
   876 		delete ((CMetadataUtilityItf*)context);
   898         delete ((CMetadataUtilityItf*) context);
   877 	}
   899         }
   878 
   900 
   879 	XAresult mmf_metadata_utility_parse_source(void* context, char* uri)
   901     XAresult mmf_metadata_utility_parse_source(void* context, char* uri)
   880 	{
   902         {
   881 		TInt err = ((CMetadataUtilityItf*)context)->ParseSource(uri);
   903         TInt err = ((CMetadataUtilityItf*) context)->ParseSource(uri);
   882 		
   904 
   883 		if(err == KErrNone)
   905         if (err == KErrNone)
   884 		{
   906             {
   885 			return XA_RESULT_SUCCESS;
   907             return XA_RESULT_SUCCESS;
   886 		}
   908             }
   887 		
   909 
   888 		return XA_RESULT_PARAMETER_INVALID;
   910         return XA_RESULT_PARAMETER_INVALID;
   889 	}
   911         }
   890 
   912 
   891 
   913     XAresult mmf_get_item_count(void* context, XAuint32* itemCount)
   892 	XAresult  mmf_get_item_count(void* context, XAuint32* itemCount)
   914         {
   893 	{
   915         if (itemCount)
   894 		if(itemCount)
   916             {
   895 		{
   917             TInt err =((CMetadataUtilityItf*) (context))->CalculateNumMetadataItems(
   896 			TInt err = ((CMetadataUtilityItf*)(context))->CalculateNumMetadataItems((TUint *)itemCount);
   918                                     (TUint *) itemCount);
   897 			if(err == KErrNone)
   919             if (err == KErrNone)
   898 			{
   920                 {
   899 				return XA_RESULT_SUCCESS;
   921                 return XA_RESULT_SUCCESS;
   900 			}
   922                 }
   901 		}
   923             }
   902 
   924 
   903 		return XA_RESULT_PARAMETER_INVALID;
   925         return XA_RESULT_PARAMETER_INVALID;
   904 	}
   926         }
   905 	
   927 
   906 	XAresult  mmf_get_key_size(void* context, XAuint32 keyIndex, XAuint32* keySize)
   928     XAresult mmf_get_key_size(void* context, XAuint32 keyIndex,
   907 	{
   929             XAuint32* keySize)
   908 		char* key = ((CMetadataUtilityItf*)(context))->GetKey(keyIndex);
   930         {
   909 		if(key && keySize)
   931         char* key = ((CMetadataUtilityItf*) (context))->GetKey(keyIndex);
   910 		{
   932         if (key && keySize)
   911 			*keySize = (strlen(key) + sizeof(XAMetadataInfo));
   933             {
   912 			
   934             *keySize = (strlen(key) + sizeof(XAMetadataInfo));
   913 			return XA_RESULT_SUCCESS;
   935 
   914 		}
   936             return XA_RESULT_SUCCESS;
   915 		
   937             }
   916 		return XA_RESULT_PARAMETER_INVALID;		
   938 
   917 	}
   939         return XA_RESULT_PARAMETER_INVALID;
   918 	
   940         }
   919 
   941 
   920 	XAresult  mmf_get_key(void* context, XAuint32 index,XAuint32 keySize, XAMetadataInfo *pKey)
   942     XAresult mmf_get_key(void* context, XAuint32 index, XAuint32 keySize,
   921 	{
   943             XAMetadataInfo *pKey)
   922 		XAresult ret = XA_RESULT_PARAMETER_INVALID;
   944         {
   923 		
   945         XAresult ret = XA_RESULT_PARAMETER_INVALID;
   924 		TInt keyDataSize = keySize - sizeof(XAMetadataInfo) + 1;
   946 
   925 		char* ascKey = ((CMetadataUtilityItf*)(context))->GetKey(index);
   947         TInt keyDataSize = keySize - sizeof(XAMetadataInfo) + 1;
   926 
   948         char* ascKey = ((CMetadataUtilityItf*) (context))->GetKey(index);
   927 		if(ascKey && keyDataSize)
   949 
   928 		{
   950         if (ascKey && keyDataSize)
   929 			TInt ascKeySize = strlen(ascKey);
   951             {
   930 			TInt outSize = (ascKeySize >= keyDataSize) ? (keyDataSize - 1) : ascKeySize;
   952             TInt ascKeySize = strlen(ascKey);
   931 			
   953             TInt outSize = (ascKeySize >= keyDataSize)
   932 			pKey->size = outSize + 1;
   954                                                        ? (keyDataSize - 1)
   933 			pKey->encoding = XA_CHARACTERENCODING_ASCII;
   955                                                           : ascKeySize;
   934 			strcpy((char *)(pKey->langCountry), "en-us");
   956 
   935 			strncpy((char *)(pKey->data), ascKey, outSize);
   957             pKey->size = outSize + 1;
   936 			pKey->data[outSize] = '\0';
   958             pKey->encoding = XA_CHARACTERENCODING_ASCII;
   937 
   959             strcpy((char *) (pKey->langCountry), "en-us");
   938 			if(ascKeySize >= keyDataSize)
   960             strncpy((char *) (pKey->data), ascKey, outSize);
   939 			{
   961             pKey->data[outSize] = '\0';
   940 				ret = XA_RESULT_BUFFER_INSUFFICIENT;
   962 
   941 			}
   963             if (ascKeySize >= keyDataSize)
   942 			else
   964                 {
   943 			{
   965                 ret = XA_RESULT_BUFFER_INSUFFICIENT;
   944 				ret = XA_RESULT_SUCCESS;
   966                 }
   945 			}
   967             else
   946 		}
   968                 {
   947 
   969                 ret = XA_RESULT_SUCCESS;
   948 		ret = XA_RESULT_SUCCESS;
   970                 }
   949 		return ret;		
   971             }
   950 	}
   972 
   951 
   973         ret = XA_RESULT_SUCCESS;
   952 	XAresult  mmf_get_value_size(void* context, XAuint32 index, XAuint32 *pValueSize)
   974         return ret;
   953 	{
   975         }
   954 		if(pValueSize)
   976 
   955 		{
   977     XAresult mmf_get_value_size(void* context, XAuint32 index,
   956 			*pValueSize = ((CMetadataUtilityItf*)(context))->GetValueSize(index) + sizeof(XAMetadataInfo) - 1; //XAMetadataInfo already includes one byte for Data
   978             XAuint32 *pValueSize)
   957 			
   979         {
   958 			return XA_RESULT_SUCCESS;
   980         if (pValueSize)
   959 		}
   981             {
   960 
   982             *pValueSize = ((CMetadataUtilityItf*) (context))->GetValueSize(
   961 		return XA_RESULT_PARAMETER_INVALID;		
   983                     index) + sizeof(XAMetadataInfo) - 1; 
   962 	}
   984             //XAMetadataInfo already includes one byte for Data
   963 
   985 
   964 	XAresult  mmf_get_value(void* context, XAuint32 index, XAuint32 valueSize, XAMetadataInfo *pValue)
   986             return XA_RESULT_SUCCESS;
   965 	{
   987             }
   966 		XAresult ret = XA_RESULT_PARAMETER_INVALID;
   988 
   967 		TInt dataSize = valueSize - sizeof(XAMetadataInfo) + 1;
   989         return XA_RESULT_PARAMETER_INVALID;
   968 		TInt outLen = 0, encodingType = CMetadataUtilityItf::EUnknownEncoding;
   990         }
   969 
   991 
   970 		if(dataSize > 0)
   992     XAresult mmf_get_value(void* context, XAuint32 index, XAuint32 valueSize,
   971 		{
   993             XAMetadataInfo *pValue)
   972 		
   994         {
   973 			TInt actualDataSize = ((CMetadataUtilityItf*)(context))->GetValue(index, (char*)pValue->data, dataSize, &outLen, &encodingType);
   995         XAresult ret = XA_RESULT_PARAMETER_INVALID;
   974 
   996         TInt dataSize = valueSize - sizeof(XAMetadataInfo) + 1;
   975 			pValue->size = outLen;
   997         TInt outLen = 0, encodingType = CMetadataUtilityItf::EUnknownEncoding;
   976 			pValue->encoding = (encodingType == CMetadataUtilityItf::EUnicodeEncoding) ? XA_CHARACTERENCODING_UTF16LE : XA_CHARACTERENCODING_BINARY;
   998 
   977 			strcpy((char *)(pValue->langCountry), "en-us");
   999         if (dataSize > 0)
   978 
  1000             {
   979 			if(!actualDataSize)
  1001 
   980 			{
  1002             TInt actualDataSize =
   981 				return XA_RESULT_INTERNAL_ERROR;
  1003                     ((CMetadataUtilityItf*) (context))->GetValue(index,
   982 			}
  1004                             (char*) pValue->data, dataSize, &outLen,
   983 			if(actualDataSize > dataSize)
  1005                             &encodingType);
   984 			{
  1006 
   985 				ret = XA_RESULT_BUFFER_INSUFFICIENT;
  1007             pValue->size = outLen;
   986 			}
  1008             pValue->encoding
   987 			else
  1009                     = (encodingType == CMetadataUtilityItf::EUnicodeEncoding) 
   988 			{
  1010                     ? XA_CHARACTERENCODING_UTF16LE : XA_CHARACTERENCODING_BINARY;
   989 				ret = XA_RESULT_SUCCESS;
  1011             strcpy((char *) (pValue->langCountry), "en-us");
   990 			}
  1012 
   991 		}
  1013             if (!actualDataSize)
   992 			
  1014                 {
   993 		return ret; 
  1015                 return XA_RESULT_INTERNAL_ERROR;
   994 	}
  1016                 }
   995 }
  1017             if (actualDataSize > dataSize)
   996 
  1018                 {
       
  1019                 ret = XA_RESULT_BUFFER_INSUFFICIENT;
       
  1020                 }
       
  1021             else
       
  1022                 {
       
  1023                 ret = XA_RESULT_SUCCESS;
       
  1024                 }
       
  1025             }
       
  1026 
       
  1027         return ret;
       
  1028         }
       
  1029     }
       
  1030