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