• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /* ------------------------------------------------------------------
2  * Copyright (C) 1998-2009 PacketVideo
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  *      http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
13  * express or implied.
14  * See the License for the specific language governing permissions
15  * and limitations under the License.
16  * -------------------------------------------------------------------
17  */
18 /**
19  * @file pv_id3_parcom.h
20  * @brief ID3 tag parser-composer utility
21  */
22 
23 #ifndef PV_ID3_PARCOM_H_INCLUDED
24 #define PV_ID3_PARCOM_H_INCLUDED
25 
26 #ifndef OSCL_BASE_H_INCLUDED
27 #include "oscl_base.h"
28 #endif
29 #ifndef OSCL_STRING_H_INCLUDED
30 #include "oscl_string.h"
31 #endif
32 #ifndef OSCL_MEM_H_INCLUDED
33 #include "oscl_mem.h"
34 #endif
35 #ifndef OSCL_STRING_CONTAINERS_H_INCLUDED
36 #include "oscl_string_containers.h"
37 #endif
38 #ifndef OSCL_VECTOR_H_INCLUDED
39 #include "oscl_vector.h"
40 #endif
41 #ifndef OSCL_REFCOUNTER_MEMFRAG_H_INCLUDED
42 #include "oscl_refcounter_memfrag.h"
43 #endif
44 #ifndef OSCL_SHARED_PTR_H_INCLUDED
45 #include "oscl_shared_ptr.h"
46 #endif
47 #ifndef PVMI_KVP_INCLUDED
48 #include "pvmi_kvp.h"
49 #endif
50 #ifndef PVMF_META_DATA_H_INCLUDED
51 #include "pvmf_meta_data_types.h"
52 #endif
53 #ifndef PVFILE_H_INCLUDED
54 #include "pvfile.h"
55 #endif
56 #ifndef PVMF_RETURN_CODES_H_INCLUDED
57 #include "pvmf_return_codes.h"
58 #endif
59 #ifndef PV_ID3_PARCOM_TYPES_H_INCLUDED
60 #include "pv_id3_parcom_types.h"
61 #endif
62 #ifndef OSCL_STRING_UTILS_H_INCLUDED
63 #include "oscl_string_utils.h"
64 #endif
65 #ifndef OSCL_UTF8CONV_H
66 #include "oscl_utf8conv.h"
67 #endif
68 #ifndef PV_ID3_PARCOM_CONSTANTS_H_INCLUDED
69 #include "pv_id3_parcom_constants.h"
70 #endif
71 
72 /** Forward declaration */
73 class PVLogger;
74 
75 /**
76  * PVID3ParCom is an ID3 Tag parser-composer utility. This utiltiy allows user to parse an ID3 tag
77  * to retrieve tag information, modify an existing ID3 tag and compose a new ID3 tag.
78  */
79 class PVID3ParCom
80 {
81     public:
82         /** Default constructor */
83         OSCL_IMPORT_REF PVID3ParCom();
84 
85         /** Destructor */
86         OSCL_IMPORT_REF ~PVID3ParCom();
87 
88         /**
89          * @brief Checks the file for the presence of ID3V2 Tags.
90          *
91          * This function checks the file for the presence of ID3V2 Tag
92          * This tag is  denoted by the string "ID3" at the begining of file.
93          * This method also reads the Id3 tag size from the file and returns
94          * to the caller.
95          *
96          * @returns True if Id3V2 tag present otherwise False
97          * @ aTagSize: size of the ID3 tag, if present, else 0
98          */
99         OSCL_IMPORT_REF bool IsID3V2Present(PVFile* aFile, uint32& aTagSize);
100 
101         /**
102          * Gets size of ID3 tag in the specified file without parsing the entire tag for its data.
103          *
104          * @param aFile File handle of the file containing the ID3 tag
105          * @return Size of ID3 tag. Returns 0 if ID3 tag is not found.
106          */
107         OSCL_IMPORT_REF uint32 GetID3TagSize(PVFile* aFile);
108 
109         /**
110          * Gets size of ID3 tag in a memory fragment without parsing the entire tag for its data.
111          *
112          * @param aTag Memory fragment containing the ID3 tag
113          * @return Size of ID3 tag. Returns 0 if ID3 tag is not found.
114          */
115         OSCL_IMPORT_REF uint32 GetID3TagSize(const OsclMemoryFragment& aTag);
116         /**
117          * Gets the size of a parsed ID3 tag.
118          *
119          * @return Size of ID3 tag.  Returns 0 if called before an ID3 tag is parsed by ParseID3Tag() call.
120          */
121         OSCL_IMPORT_REF uint32 GetID3TagSize();
122 
123         /**
124          * Sets the maximum size of a composed ID3 tag. It is an option to pad the composed ID3 tag
125          * to the specified maximum size.  If the composed ID3 tag exceeds the maximum size, one
126          * or more ID3 frames data will be truncated.  This API is applicable only for ID3V2 tags.
127          *
128          * @param aUseMaxSize When set to true, the composed ID3 tag will have a maximum size of
129          *                    aMaxSize.  When set to false, the tag will not have a maximum size.
130          *                    By default, maximum tag size is disabled by this library.
131          * @param aMaxSize Maximum size of the composed ID3 tag in bytes
132          * @param aUsePadding When set to true, the composed ID3 tag will be padded to the
133          *                    specified maximum size.
134          * @return Completion status. Returns PVMFErrNotSupported if ID3V1 is used.
135          */
136         OSCL_IMPORT_REF PVMFStatus SetMaxID3TagSize(bool aUseMaxSize, uint32 aMaxSize, bool aUsePadding);
137 
138         /**
139          * Parse an ID3 tag from the specified file.
140          *
141          * @param aFile File handle of the file containing the ID3 tag to be parsed
142          * @return Completion status. If no ID3 tag is found in the file, PVMFFailure is returned.
143          */
144         OSCL_IMPORT_REF PVMFStatus ParseID3Tag(PVFile* aFile, uint32 buffsize = 100);
145 
146         /**
147          * Parse an ID3 tag from the specified memory fragment.
148          *
149          * @param aTag Memory fragment containing the ID3 tag to be parsed
150          * @return Completion status. If no ID3 tag is found in the memory fragment, PVMFFailure is returned.
151          */
152         OSCL_IMPORT_REF PVMFStatus ParseID3Tag(const OsclMemoryFragment& aTag);
153 
154         /**
155          * Query the version of ID3 used for this tag.
156          *
157          * @return ID3 version of the tag.
158          */
159         OSCL_IMPORT_REF PVID3Version GetID3Version() const;
160 
161         /**
162          * Query if id3v1 present in the clip.
163          *
164          * @return true if present
165          */
166         OSCL_IMPORT_REF bool IsID3V1Present() const;
167 
168         /**
169          * Query if id3v2 present in the clip.
170          *
171          * @return true if present
172          */
173         OSCL_IMPORT_REF bool IsID3V2Present() const;
174 
175         /**
176          * Retrieve a vector of key-value pairs containing data of all ID3 frames in the ID3 tag.
177          *
178          * @param aFrames Output parameter to store key-value pairs containing data of ID3 frames from the tag.
179          * @return Status of completion.
180          */
181         OSCL_IMPORT_REF PVMFStatus GetID3Frames(PvmiKvpSharedPtrVector& aFrames);
182 
183         /**
184          * Retrieve an ID3 frame of the specified type in the ID3 tag.
185          *
186          * @param aFrameType Type of ID3 frame to be retrieved
187          * @param aFrame Output parameter to store key-value pair containing data of requested ID3 frame.
188          * @return Status of completion. Returns PVMFFailure if a frame of the specified
189          *         type is not found.
190          */
191         OSCL_IMPORT_REF PVMFStatus GetID3Frame(const OSCL_String& aFrameType, PvmiKvpSharedPtrVector& aFrame);
192 
193         /**
194         *   Check if frame of aFrameType is available
195         * @param aFrameType Type of ID3 frame
196         * @return true if frame is available otherwise false
197         */
198         OSCL_IMPORT_REF bool IsID3FrameAvailable(const OSCL_String& aFrameType);
199 
200         /**
201          * Sets ID3 version to be used.
202          *
203          * When composing a new ID3 tag, the default ID3 version is v2.4. When modifying
204          * an existing ID3 tag, if it is ID3v2.x and is changed to ID3v1.x, ID3 frames
205          * that are not supported by ID3v1.x will be removed from the tag and data strings
206          * will be trimmed to the maximum lengths specified in ID3v1.x.
207          *
208          * @param aVersion ID3 version.
209          * @return Status of completion.
210          */
211         OSCL_IMPORT_REF PVMFStatus SetID3Version(PVID3Version aVersion);
212 
213         /**
214          * Sets an ID3 frame in the ID3 tag.
215          *
216          * If the frame does not already exist, a new frame will be created and added
217          * to the tag.  If a frame of the same type already exists, the frame data will
218          * be updated and saved to the tag.
219          *
220          * @param aFrame ID3 frame to be set in the tag.
221          * @return Status of completion.
222          */
223         OSCL_IMPORT_REF PVMFStatus SetID3Frame(const PvmiKvp& aFrame);
224 
225         /**
226          * Removes an ID3 frame of the specified type in the ID3 tag.
227          *
228          * @param aFrameType Type of ID3 frame to be removed.
229          * @return Completion status. Returns PVMFFailure if ID3 frame of the specified type
230          *         is not found in the tag.
231          */
232         OSCL_IMPORT_REF PVMFStatus RemoveID3Frame(const OSCL_String& aFrameType);
233 
234         /**
235          * Compose an ID3 tag and return a shared pointer to the formatted tag to user.
236          *
237          * ID3 tag is composed using ID3 frames that are set for the tag.  Data strings in ID3 frames are
238          * converted from Unicode to the character set specified in the frame when composing the tag.
239          * The tag is formatted to the specified ID3 version and written to the memory fragment provided
240          * by user.  This method will erase all data from the memory fragment before writing the ID3 tag.
241          * If the memory fragment does not contain allocated memory or the capacity of fragment is less
242          * than the size of ID3 tag to be written, this method would allocate memory before writing the ID3
243          * tag. There must be at least one valid ID3 frame assoicated to the tag to compose successfully.
244          *
245          * When composing a new ID3 tag (i.e. not editing an existing tag), if no ID3 version is specified
246          * through SetID3Version(), it is defaulted to ID3 v2.4.
247          *
248          * @param aTag Output parameter of memory fragment to which the formatted ID3 tag data will be written.
249          * @return Completion status.  Returns PVMFFailure if no ID3 frame is associated with this tag.
250          */
251         OSCL_IMPORT_REF PVMFStatus ComposeID3Tag(OsclRefCounterMemFrag& aTag);
252 
253         /**
254          * Reset the parser-composer and remove all ID3 frames.
255          *
256          * @return Completion status.
257          */
258         OSCL_IMPORT_REF PVMFStatus Reset();
259 
260         /**
261          * This function returns byte offset to the end of id3 tag. Audio frame follows ID3 tag.
262          *
263          * @return byte offset to end of id3 tag.
264          */
265 
GetByteOffsetToStartOfAudioFrames()266         OSCL_IMPORT_REF uint32 GetByteOffsetToStartOfAudioFrames()
267         {
268             return iByteOffsetToStartOfAudioFrames;
269         }
270 
271         /**
272          * This function looks for ID3 V2.4 tag at the end of file.
273          * It will look for ID3 footer starting from the offset till buff_sz. If footer is found, it will get the
274          * id3 tag size from the footer header and parse ID3 tag.
275          * @param buff_sz size of the buffer to look for footer
276          * @param offset in file from the end of file. e.g An offset of 0 means end of file
277          * @return Comletion status.
278          */
279 
280         OSCL_IMPORT_REF PVMFStatus LookForV2_4Footer(uint32 buff_sz, uint32 offset);
281         /**
282          * This function will look for ID3 footer starting from the offset till buff_sz.
283          * @param buff_sz size of the buffer to look for footer
284          * @param offset in file from the end of file. e.g An offset of 0 means end of file
285          * @return footer location in file otherwise 0 if no footer is found
286          */
287 
288         uint32 SearchTagV2_4(uint32 buff_sz, uint32 offset);
289 
290 
291     public:
292         /** Enumerated list of supported character sets */
293         typedef enum
294         {
295             PV_ID3_CHARSET_INVALID = -1,
296             PV_ID3_CHARSET_ISO88591 = 0,
297             PV_ID3_CHARSET_UTF16    = 1,
298             PV_ID3_CHARSET_UTF16BE  = 2,
299             PV_ID3_CHARSET_UTF8     = 3,
300             PV_ID3_CHARSET_END      = 4,
301         } PVID3CharacterSet;
302 
303     private:
304         /** Enumerated list of ID3 Frame Types */
305         typedef enum
306         {
307             PV_ID3_FRAME_INVALID = -3,
308             PV_ID3_FRAME_CANDIDATE,     /**< Frame ID doesn't match with known frame IDs.
309                                          The frame ID made out of the characters capital A-Z and 0-9.*/
310             PV_ID3_FRAME_UNRECOGNIZED,  /** Valid frame ID, but ID3 parcom doesn't support. */
311             PV_ID3_FRAME_TITLE,         /**< Title. Supported by all ID3 versions. Maximum 30 characters for
312                                          ID3v1.x. There is no maximum length limit for ID3v2.x. */
313             PV_ID3_FRAME_ARTIST,        /**< Artist. Supported by all ID3 versions. Maximum 30 characters for
314                                          ID3v1.x. There is no maximum length limit for ID3v2.x*/
315             PV_ID3_FRAME_ALBUM,         /**< Album. Supported by all ID3 versions. Maximum 30 characters for
316                                          ID3v1.x. There is no maximum length limit for ID3v2.x */
317             PV_ID3_FRAME_YEAR,          /**< 4-character numeric string with the year of the recording.
318                                          Supported by all ID3 version. */
319             PV_ID3_FRAME_COMMENT,       /**< Comment. Supported by all ID3 versions. Maximum 30 characters for
320                                          ID3v1.x. There is no maximum length limit for ID3v2.x. */
321             PV_ID3_FRAME_TRACK_NUMBER,  /**< Numeric string of track number on Album. Supported by ID3v1.1 and later. */
322             PV_ID3_FRAME_GENRE,         /**< Genre of the music. For ID3v1.x, numeric string of genre type value
323                                          defined at http://www.id3.org/id3v2.3.0.html#secA should be used.
324                                          ID3v2.x should use the genre name, or refer to ID3v1.x genre type
325                                          using the format "(genre_number)" where genre_number is a numeric
326                                          string of ID3v1.x genre type value. */
327             PV_ID3_FRAME_COPYRIGHT,      /**< Copyright message. It must begin with a 4-character numeric string of
328                                          the year of copyright and a space character. Supported by ID3v2.x or later. */
329             PV_ID3_FRAME_TRACK_LENGTH,   /**< Track length. The duration in milliseconds.*/
330             PV_ID3_FRAME_DATE,
331             PV_ID3_FRAME_PADDED,         /**< Padding. A frame padded with zero.*/
332 
333             PV_ID3_FRAME_PIC,            /**< PIC. */
334             PV_ID3_FRAME_APIC,           /**< APIC.*/
335             PV_ID3_FRAME_LYRICS,             /**< Unsynchronized Lyrics.*/
336             PV_ID3_FRAME_SEEK,           /* For SEEK frame */
337             PV_ID3_FRAME_RECORDING_TIME,  /* RECORDING TIME */
338             PV_ID3_FRAME_AUTHOR,          /* author or writer*/
339             PV_ID3_FRAME_COMPOSER,        /* music composer */
340             PV_ID3_FRAME_DESCRIPTION,     /* brief description of the content */
341             PV_ID3_FRAME_VERSION,         /* Software version of the authoring software */
342             PV_ID3_FRAME_PART_OF_SET,     /* Which part of a set this belongs to */
343 
344             PV_ID3_FRAME_EEND            /**< End. Marks end of frames.*/
345         } PVID3FrameType;
346 
347         /**
348          *  @brief The TID3TagInfo class acts as temporary storage for information
349          *  extracted from the different types of ID3 tags to a given ID3tag file. This
350          *  class is created to keep track of certain qualities of an ID3 tag that
351          *  the caller of the ID3 library would not need to know.
352          */
353         struct TID3TagInfo
354         {
355             uint32      iPositionInFile;
356             PVID3CharacterSet iTextType;
357 
358             uint32    iID3V2FrameSize;
359             uint32    iID3V2SeekOffset;
360             uint8     iID3V2TagFlagsV2;
361             uint32    iID3V2ExtendedHeaderSize;
362             uint32    iID3V2TagSize;
363             uint8     iID3V2FrameID[5];
364             uint8     iID3V2FrameFlag[2];
365             bool      iFooterPresent;
366             uint8     iID3V2LanguageID[4];
367 
368         };
369 
370         /**
371          * @brief Checks the ID3 Tag v2.4 frame size whether it is syncsafe or not.
372          *
373          * This function validates next ID3 frame to check whether frame size is
374          * syncsafe.
375          *
376          * @returns Validated frame size
377          */
378         uint32 ValidateFrameLengthV2_4(uint32 aFrameSize);
379 
380         /**
381          * @brief Checks the ID3 Tag v2.4 frame is valid or not.
382          *
383          * This function validates ID3 frame type and then, frame size and flags
384          *
385          * @params
386          * [IN] bUseSyncSafeFrameSize - validate syncsafe/non-syncsafe frame size
387          * [OUT] frameType - frame type for frame currently validated
388          *
389          * @returns validation status
390          */
391         bool ValidateFrameV2_4(PVID3FrameType& frameType, bool bUseSyncSafeFrameSize = true);
392 
393         /**
394          * @brief Checks the file for the presence of ID3V1 Tag.
395          *
396          * This function checks the file for the presence of ID3V1 Tag. This tag is
397          * denoted by the string "TAG" starting 128 bytes in from the end-of-file.
398          *
399          * @returns True if Id3V1 tag present otherwise False
400          */
401         bool CheckForTagID3V1();
402 
403         /**
404          * @brief Checks the file for the presence of ID3V2 Tag attached to
405          * the beginning of the ID3tag file.
406          *
407          * This function checks the file for the presence of ID3V2 Tag attached to
408          * the beginning of the ID3 file. This tag is  denoted by the string "ID3"
409          * at the very beginning of the ID3 file.
410          *
411          * @returns True if Id3V2 tag present otherwise False
412          */
413         bool CheckForTagID3V2();
414 
415         /**
416          * @brief Parses the file and populates the frame vector when an ID3V1
417          * tag is found and no ID3V2 tag was found.
418          *
419          * This function parses the file and populates the frame vector when
420          * an ID3V1 tag is found to be attached to the ID3 file and no ID3V2 tag was
421          * found. The data in the ID3V1 tag can only be ASCII, so the ConvertToUnicode
422          * must be called for all fields read from the ID3V1 tag.
423          *
424          * @param None
425          * @returns None
426          */
427         void ReadID3V1Tag();
428 
429         /**
430          * @brief reads id3 V2 tag header.
431          * @param aReadTags, read the id3 frames when true, else just reads the header
432          * @@returns true if tags were read successfully
433          */
434         bool ReadHeaderID3V2(bool aReadTags = true);
435 
436         /**
437          * @brief Parses the ID3V2 tag frames from the file and populates the
438          * frame vector when an ID3V2 tag is found
439          * @param version ID3 V2 sub version number (v2.2, v2.3 or v2.4)
440          * * @returns number of tags successfully parsed
441          */
442         int ReadTagID3V2(PVID3Version version);
443 
444         /**
445          * @brief Parses the frame and populates the iID3TagInfo structure
446          * when an ID3V2 tag is found.
447          *
448          * This function parses the ID3 tag frames from the file and populates the
449          * frame vector when an ID3V2 tag is found attached to the start
450          * of a ID3 file.
451          *
452          * @param version ID3 V2 sub version number (v2.2, v2.3 or v2.4)
453          * @returns None
454          */
455         void ReadFrameHeaderID3V2(PVID3Version version);
456 
457         /**
458         * @brief Parses the frame and populates the iID3TagInfo structure
459         * when an ID3V2_2 tag is found.
460         *
461         * This function parses the ID3 tag frames from the file and populates the
462         * frame vector when an ID3V2_2 tag is found attached to the start
463         * of a ID3 file.
464         *
465         * @param None
466         * @returns None
467         */
468         void ReadFrameHeaderID3V2_2();
469 
470         /**
471          * @brief Receives a ID3V2 frame and handles it accordingly. All of the frames
472          * sent to this function have ASCII strings in them.
473          *
474          * This function receives a ID3V2 frame and handles it accordingly. Each
475          * frame header is composed of 10 bytes - 4 bytes for FrameID, 4 bytes for
476          * FrameSize, and 2 bytes for FrameFlags, respectively. Once we have a
477          * frame's unique FrameID, we can handle the frame accordingly. (eg. The
478          * frame with FrameID = "TIT2" contains data describing the title of an ID3
479          * file. Clearly, the data in that frame should be copied to it respective
480          * location in frame vector. The location for the data with FrameID = "TIT2"
481          * goes in the Title frame.
482          *
483          * @param aFrameType Enumerated TFrameTypeID3V2 type; used to determine if
484          * Frame is supported
485          * @param aPos Position in file where frame data begins
486          * @param aSize Size of the frame data
487          * @returns None
488          */
489         void HandleID3V2FrameDataASCII(PVID3FrameType aframeType,
490                                        uint32 aPos,
491                                        uint32 aSize);
492 
493         /**
494          * @brief Receives a ID3V2 frame and handles it accordingly. All of the frames
495          * sent to this function have unicode strings in them.
496          *
497          * This function receives a ID3V2 frame and handles it accordingly. Each
498          * frame header is composed of 10 bytes - 4 bytes for FrameID, 4 bytes for
499          * FrameSize, and 2 bytes for FrameFlags, respectively. Once we have a
500          * frame's unique FrameID, we can handle the frame accordingly. (eg. The
501          * frame with FrameID = "TIT2" contains data describing the title of an ID3
502          * file. Clearly, the data in that frame should be copied to it respective
503          * location in Frame vector. The location for the data with FrameID = "TIT2"
504          * goes in the Title frame.iTitle buffer. All of the frames
505          * sent to this function have unicode strings in them that will need to be
506          * read different than the ASCII strings.
507          *
508          * @param aFrameType Enumerated TFrameTypeID3V2 type; used to determine if
509          * Frame is supported
510          * @param aPos Position in file where frame data begins
511          * @param aSize Size of the frame data
512          * @param aEndianType Flag indicator regarding the text endian type
513          * @returns None
514          */
515         void HandleID3V2FrameDataUnicode16(PVID3FrameType aframeType,
516                                            uint32 aPos,
517                                            uint32 aSize,
518                                            uint32 aEndienType);
519 
520         /**
521          * @brief Receives a ID3V2 frame and handles it accordingly. All of the frames
522          * sent to this function have UTF8 strings in them.
523          *
524          * This function receives a ID3V2 frame and handles it accordingly. Each
525          * frame header is composed of 10 bytes - 4 bytes for FrameID, 4 bytes for
526          * FrameSize, and 2 bytes for FrameFlags, respectively. Once we have a
527          * frame's unique FrameID, we can handle the frame accordingly. (eg. The
528          * frame with FrameID = "TIT2" contains data describing the title of an ID3
529          * file. Clearly, the data in that frame should be copied to it respective
530          * location in Frame vector. The location for the data with FrameID = "TIT2"
531          * goes in the Title frame. All of the frames sent to this function have UTF8
532          * strings in them that will need to be read different than the ASCII strings.
533          *
534          * @param aFrameType Enumerated TFrameTypeID3V2 type; used to determine if
535          * Frame is supported
536          * @param aPos Position in file where frame data begins
537          * @param aSize Size of the frame data
538          * @returns None
539          */
540         void HandleID3V2FrameDataUTF8(PVID3FrameType aframeType,
541                                       uint32 aPos,
542                                       uint32 aSize);
543 
544 
545         /**
546          * @brief This function handls id3 frames that are not currently supported by
547          * the id3parcom library. It stores the frame alongwith the header as it is read from the file.
548          * @param aFrameType Enumerated TFrameTypeID3V2 type; It will be PV_ID3_FRAME_UNSUPPORTED
549          * @param aPos Position in file where frame data begins
550          * @param aSize Size of the frame data
551          * @returns None
552          */
553 
554         void HandleID3V2FrameUnsupported(PVID3FrameType aframeType,
555                                          uint32 aPos,
556                                          uint32 aSize);
557 
558         /**
559          * @brief Detects the ID3V2FrameType and returns the enum value that
560          * corresponds to the current frame.
561          *
562          * @param None
563          * @returns Value that describes the current frame of type PVID3FrameType
564          */
565         PVID3FrameType FrameSupportedID3V2(PVID3Version version, uint8* aframeid = NULL);
566 
567         /**
568          * @brief Detects the ID3V2FrameType and fine whether it us unsupported or
569          * invalid frame type.
570          *
571          * @param None
572          * @returns Value that describes the current frame of type PVID3FrameType
573          */
574         PVID3FrameType FrameValidatedID3V2_4(uint8* aFrameID);
575 
576         /**
577          * @brief Detects the ID3V 2.2 FrameType and returns the enum value that
578          * corresponds to the current frame.
579          *
580          * @param None
581          * @returns Value that describes the current frame of type PVID3FrameType
582          */
583         PVID3FrameType FrameSupportedID3V2_2(void);
584 
585         /**
586          * @brief Converts the data in the TBuf8 buffer and puts the data into the
587          * TBuf16 buffer
588          *
589          * @param aPtrFrameData8 Pointer to intput string format of either big
590          * or little endian.
591          * @param aSize Number of character elements in aPtrFrameData8
592          * @param aEndianType Indicates if the encoded Unicode text in the
593          * aPtrFrameData8 buffer is in big or little endian.
594          * @param aPtrFrameData16 Pointer to the output string in unicode format.
595          * @returns None
596          */
597         uint32 EightBitToWideCharBufferTransfer(const uint8* aPtrFrameData,
598                                                 uint32 aSize,
599                                                 uint32 aEndianType,
600                                                 oscl_wchar* aPtrFrameData16);
601 
602 
603         //convert an interger to Synchsafe integer
604         uint32 ConvertToSyncSafeInt(uint32 src);
605         uint32 SafeSynchIntToInt32(uint32 SafeSynchInteger);
606 
607         /**
608          * @brief Read in byte data and take most significant byte first
609          *
610          * @param aInputFile File handle to input file
611          * @param data Reference to output data buffer where the data read from file will be stored
612          * @return true if the read is successful
613          */
614         bool readByteData(PVFile* aInputFile, uint32 length, uint8 *data);
615 
616         /**
617          * @brief Read in the 32 bits byte by byte and take most significant byte first
618          *
619          * @param aInputFile File handle to input file
620          * @param data Reference to output data buffer where the data read from file will be stored
621          * @return true if the read is successful
622          */
623         bool read32(PVFile* aInputFile, uint32 &data);
624 
625         /**
626          * @brief Read in the 24 bits byte by byte and take most significant byte first
627          *
628          * @param aInputFile File handle to input file
629          * @param data Reference to output data buffer where the data read from file will be stored
630          * @return true if the read is successful
631          */
632         bool read24(PVFile* aInputFile, uint32 &data);
633 
634         /**
635          * @brief Read in 8 bytes from specified input file
636          *
637          * @param aInputFile File handle to input file
638          * @param data Reference to output data buffer where the data read from file will be stored
639          * @return true if the read is successful
640          */
641         bool read8(PVFile* aInputFile, uint8 &data);
642 
643         /**
644          * @brief Read in 16 bytes from specified input file
645          *
646          * @param aInputFile File handle to input file
647          * @param data Reference to output data buffer where the data read from file will be stored
648          * @return true if the read is successful
649          */
650 
651         bool read16(PVFile* aInputFile, uint16 &data);
652 
653         /**
654          * @breif reads information stored in id3 frame
655          * @param unicode tells if the data is unicode
656          * @param frameType type of frame
657          * @param pos position in file
658          * @param currFrameLength length of the frame
659          */
660         bool  ReadFrameData(uint8 unicode, PVID3FrameType frameType, uint32 pos, uint32 currFrameLength);
661         /**
662          * @brief reads extended header if present in id3 tag header
663          * @param none
664          * @return true if success.
665          */
666         bool ReadExtendedHeader();
667 
668         /**
669          * @brief allocate memeory for key value pair structure.
670          * @param aKey key string
671          * @param aValueType type of key value
672          * @param aValueSize size of key value
673          * @param truncate bool type indicates if the frame was truncated.
674          * @return shared pointer to key value pair structure
675          */
676         PvmiKvpSharedPtr AllocateKvp(OSCL_String& aKey, PvmiKvpValueType aValueType, uint32 aValueSize, bool &truncate);
677 
678         /**
679          * @brief forms key string for id3 frames
680          * @param aKey key string
681          * @param aType frame type
682          * @param aCharSet text encoding type (unicode, ascii)
683          * @return Completion status
684          */
685         PVMFStatus ConstructKvpKey(OSCL_String& aKey, PVID3FrameType aType, PVID3CharacterSet aCharSet);
686 
687         /**
688          * @brief reads string data in frames
689          * @param aFrameType frame type
690          * @param aCharSet text encoding
691          * @param aValueSize size of the frame data
692          * @return Completion status
693          */
694         PVMFStatus ReadStringValueFrame(PVID3FrameType aFrameType, PVID3CharacterSet aCharSet, uint32 aValueSize);
695 
696         /**
697          * @brief reads frame of type track length
698          * @param aValueSize size of the frame
699          * @param aCharSet text encoding
700          * @return completion status
701          */
702         PVMFStatus ReadTrackLengthFrame(uint32 aValueSize, PVID3CharacterSet aCharSet);
703 
704         /**
705          * @brief reads ID3 frames
706          * @param aFrameType frame type
707          * @param aValueSize size of the frame data
708          * @return Completion status
709          */
710 
711         PVMFStatus ReadFrame(PVID3FrameType aFrameType, uint32 aValueSize);
712 
713 
714         /**
715          * @brief This function is costructing the key-value pair for AlbumArt(apic/pic) frame. It
716          * first converts the AlbumArt frame in to the PvmfApicStruct and then set the
717          * key_specific_value of the Pvmikvp struct.
718          * @param frame type
719          * @param unicode
720          * @param frame size
721          * @return Success if read successfull.
722          */
723         PVMFStatus ReadAlbumArtFrame(PVID3FrameType aFrameType, uint8 unicode, uint32 aFrameSize);
724 
725         /**
726          * @brief This function extracts the albumart information, for ascii data, based on frametype (apic/pic).
727          * @param frame type
728          * @param frame size
729          * @param Image format
730          * @param description
731          * @param picture type
732          * @param data length
733          * @return Success if conversion is successfull.
734             */
735         PVMFStatus GetAlbumArtInfo(PVID3FrameType aFrameType, uint32 aFrameSize, OSCL_HeapString<OsclMemAllocator> &ImageFormat,
736                                    uint8 &PicType, OSCL_HeapString<OsclMemAllocator> &Description,  uint32 &DataLen);
737         /**
738          * @brief This function extracts the albumart information, for unicode data, based on frametype (apic/pic).
739          * @param frame type
740          * @param frame size
741          * @param Image format
742          * @param description
743          * @param picture type
744          * @param data length
745          * @return Success if conversion is successfull.
746          */
747         PVMFStatus GetAlbumArtInfo(PVID3FrameType aFrameType, uint32 aFrameSize, OSCL_HeapString<OsclMemAllocator> &ImageFormat,
748                                    uint8 &PicType, OSCL_wHeapString<OsclMemAllocator> &aDescription, uint32 &DataLen);
749 
750 
751 
752         /**
753          * @brief This function does the actual conversion from the raw ascii data from the
754          * GetAlbumArtInfo function to the PvmfApicStruct.
755          * @param MimeType
756          * @param Description
757          * @param GraphicType
758          * @param GraphicDataLen
759          * @param pointer to memory allocated to store kvp information
760          * @return Success if conversion is successfull.
761          */
762         PVMFStatus ConvertUnicodeDataToApic(char* aMimeTypeID3, oscl_wchar* aDescriptionID3,
763                                             uint8 aGraphicType, uint32 aGraphicDataLen,
764                                             void *key_specific_value, uint32 total_size);
765 
766         /**
767          * @brief This function does the actual conversion from the raw unicode data from the
768          * ConvertPictureToAPIC function to the PvmfApicStruct.
769          * @param MimeType
770          * @param Description
771          * @param GraphicType
772          * @param GraphicOffset
773          * @param GraphicDataLen
774          * @param pointer to memory allocated to store kvp information
775          * @return Success if conversion is successfull.
776          */
777         PVMFStatus ConvertAsciiDataToApic(char* aMimeTypeID3, char* aDescriptionID3,
778                                           uint8 aGraphicType, uint32 aGraphicDataLen,
779                                           void *key_specific_value, uint32 total_size);
780 
781         /**
782          * @brief Read the information from the USLT/ULT frames.
783          * @param NULL
784          * @return Success if successfully read.
785          */
786         PVMFStatus ReadLyricsCommFrame(uint8 unicodeCheck, uint32 aFramesize, PVID3FrameType aFrameType);
787 
788 
789         /**
790          * @brief Reads Null terminated ascii strings from file
791          * @param aInputFile file pointer
792          * @parm data heap string to store string
793          * @return true on success otherwise false
794          */
795         bool readNullTerminatedAsciiString(PVFile* aInputFile, OSCL_HeapString<OsclMemAllocator> &data);
796 
797         /**
798          * @brief Reads Null terminated unicode strings from file
799          * @param aInputFile file pointer
800          * @parm data heap string to store string
801          * @return completion status
802          */
803 
804         PVMFStatus readNullTerminatedUnicodeString(PVFile* aInputFile, OSCL_wHeapString<OsclMemAllocator> &aData, uint32 &bomSz);
805 
806         /**
807          * @brief reads frame of type comment
808          * @param aValueSize size of the frame
809          * @return completion status
810          */
811 
812         PVMFStatus ReadCommentFrame(uint32 aValueSize);
813 
814         /**
815          * @brief Gets value type and char set stored in kvp
816          * @param aKvp shared pointer to kvp
817          * @param aValueType value type
818          * @param aCharSet char set
819          * @return Completion status.
820          */
821         PVMFStatus GetKvpValueType(PvmiKvpSharedPtr aKvp, PvmiKvpValueType& aValueType, PVID3CharacterSet& aCharSet);
822 
823         /**
824          * @brief Gets frame ID and frame type from kvp
825          * @param aKvp  shared pointer to key value pair structure
826          * @param aFrameID frame ID
827          * @param aFrameType frame type
828          * @return Completion status.
829          */
830         PVMFStatus GetFrameTypeFromKvp(PvmiKvpSharedPtr aKvp, OSCL_String& aFrameID, PVID3FrameType& aFrameType);
831 
832         /**
833          * @brief Gets frame ID and frame type from kvp
834          * @param aKvp  key value pair structure
835          * @param aFrameID frame ID
836          * @param aFrameType frame type
837          * @return Completion status.
838          */
839         PVMFStatus GetFrameTypeFromKvp(const PvmiKvp& aKvp, OSCL_String& aFrameID, PVID3FrameType& aFrameType);
840 
841         /**
842          * @brief Get Size of ID3 frame stored in kvp.
843          * @param akvp shared pointer to kvp
844          * @param aValueType type of value stored in kvp
845          * @param aCharSet character set of value
846          * @param aSize size of the frame
847          * @return Completion Status
848          */
849         PVMFStatus GetID3v2FrameDataSize(PvmiKvpSharedPtr aKvp, PvmiKvpValueType aValueType,
850                                          PVID3CharacterSet aCharSet, uint32& aSize);
851 
852         /**
853          * @brief compose ID3 V2 tag
854          * @param aTag reference counter to memory fragment
855          * @return Completion Status
856          */
857         PVMFStatus ComposeID3v2Tag(OsclRefCounterMemFrag& aTag);
858 
859         /**
860          * @brief push frame to supplied frame vector
861          * @param aFrame Frame to be pushed
862          * @param aFrameVector vector in which frame is to be pushed
863          * @return Completion Status
864          */
865         PVMFStatus PushFrameToFrameVector(PvmiKvpSharedPtr& aFrame, PvmiKvpSharedPtrVector& aFrameVector);
866         /**
867          * @brief Allocate array of specified size and type of elements
868          * @param aValueType, type of array elements
869          * @param aNumElements, size of required array
870          * @return aLeaveCode, err code
871          * @return buffer, pointer to allocated buffer
872          */
873         OsclAny* AllocateValueArray(int32& aLeaveCode, PvmiKvpValueType aValueType, int32 aNumElements, OsclMemAllocator* aMemAllocator = NULL);
874 
875         /**
876          * @brief Allocate kvp and handle leave
877          * @param aValueType, type of array elements
878          * @param aValueSize, value size of required kvp
879          * @return aStatus, err code
880          * @return truncate, returns false if specified memory is not allocated, else true
881          */
882         PvmiKvpSharedPtr HandleErrorForKVPAllocation(OSCL_String& aKey, PvmiKvpValueType aValueType, uint32 aValueSize, bool &truncate, PVMFStatus &aStatus);
883 
884     private:
885 
886         // Variables for parsing
887         PVFile* iInputFile;
888         TID3TagInfo iID3TagInfo;
889         bool iTitleFoundFlag;
890         bool iArtistFoundFlag;
891         bool iAlbumFoundFlag;
892         bool iYearFoundFlag;
893         bool iCommentFoundFlag;
894         bool iTrackNumberFoundFlag;
895         bool iGenereFoundFlag;
896         int32 iFileSizeInBytes;
897         uint32 iByteOffsetToStartOfAudioFrames;
898 
899         bool iID3V1Present;
900         bool iID3V2Present;
901         // Variables for composing
902         PVID3Version iVersion;
903         PvmiKvpSharedPtrVector iFrames;
904         bool iUseMaxTagSize;
905         uint32 iMaxTagSize;
906         bool iUsePadding;
907         bool iTagAtBof;
908         bool iSeekFrameFound;
909 
910         OsclMemAllocator iAlloc;
911         PVLogger* iLogger;
912 };
913 
914 #endif // PV_ID3_PARCOM_H_INCLUDED
915 
916 
917