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