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 |