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