75 // ----------------------------------------------------------------------------- |
75 // ----------------------------------------------------------------------------- |
76 // |
76 // |
77 CMetaDataParserID3v2* CMetaDataParserID3v2::CreateID3v2ParserL( |
77 CMetaDataParserID3v2* CMetaDataParserID3v2::CreateID3v2ParserL( |
78 CMetaDataSource& aSource ) |
78 CMetaDataSource& aSource ) |
79 { |
79 { |
|
80 return CreateID3v2ParserL( aSource, 0 ); |
|
81 } |
|
82 |
|
83 // ----------------------------------------------------------------------------- |
|
84 // CMetaDataParserID3v2::CreateID3v2ParserL |
|
85 // Two-phased constructor. |
|
86 // ----------------------------------------------------------------------------- |
|
87 // |
|
88 CMetaDataParserID3v2* CMetaDataParserID3v2::CreateID3v2ParserL( |
|
89 CMetaDataSource& aSource, TUint aOffset ) |
|
90 { |
80 #ifdef _DEBUG |
91 #ifdef _DEBUG |
81 RDebug::Print(_L("CMetaDataParserID3v2::CreateID3v2ParserL")); |
92 RDebug::Print(_L("CMetaDataParserID3v2::CreateID3v2ParserL")); |
82 #endif |
93 #endif |
83 TInt version = VersionL(aSource); |
94 TInt version = VersionL(aSource, aOffset); |
84 |
95 |
85 CMetaDataParserID3v2* parser = NULL; |
96 CMetaDataParserID3v2* parser = NULL; |
86 switch ( version ) |
97 switch ( version ) |
87 { |
98 { |
88 case 2: |
99 case 2: |
158 // choose if want to parse from descriptor |
175 // choose if want to parse from descriptor |
159 if(iFrameDataSize < KParseFromMemory) // 1Mb |
176 if(iFrameDataSize < KParseFromMemory) // 1Mb |
160 { |
177 { |
161 iTag = HBufC8::NewL(iFrameDataSize); |
178 iTag = HBufC8::NewL(iFrameDataSize); |
162 TPtr8 des( iTag->Des() ); |
179 TPtr8 des( iTag->Des() ); |
163 iSource->ReadL(0, des); |
180 iSource->ReadL(iID32Offset, des); |
164 |
181 |
165 iSourceDes = CMetaDataSourceDescriptor::NewL(des); |
182 iSourceDes = CMetaDataSourceDescriptor::NewL(des); |
166 iSource = iSourceDes; |
183 iSource = iSourceDes; |
167 iParseFromDescriptor = ETrue; |
184 iParseFromDescriptor = ETrue; |
168 } |
185 } |
520 // ----------------------------------------------------------------------------- |
537 // ----------------------------------------------------------------------------- |
521 // CMetaDataParserID3v2::VersionL |
538 // CMetaDataParserID3v2::VersionL |
522 // ----------------------------------------------------------------------------- |
539 // ----------------------------------------------------------------------------- |
523 // |
540 // |
524 TInt CMetaDataParserID3v2::VersionL( |
541 TInt CMetaDataParserID3v2::VersionL( |
525 CMetaDataSource& aSource ) |
542 CMetaDataSource& aSource, TUint aOffset ) |
526 { |
543 { |
527 TInt size = 0; |
544 TInt size = 0; |
528 aSource.Size( size ); |
545 aSource.Size( size ); |
529 if ( size < KID3v2HeaderLength ) |
546 if ( size < KID3v2HeaderLength ) |
530 { |
547 { |
531 // This isn't ID3v2 |
548 // This isn't ID3v2 |
532 return KErrNotFound; |
549 return KErrNotFound; |
533 } |
550 } |
534 |
551 |
535 TBuf8<KID3v2HeaderLength> header; |
552 TBuf8<KID3v2HeaderLength> header; |
536 aSource.ReadL( header ); |
553 aSource.ReadL( aOffset, header ); |
537 // ID3v2 header consists of following parts: |
554 // ID3v2 header consists of following parts: |
538 // - identifier "ID3", 3 bytes |
555 // - identifier "ID3", 3 bytes |
539 // - version, 2 bytes |
556 // - version, 2 bytes |
540 // - flags, 1 byte |
557 // - flags, 1 byte |
541 // - data length, 4 bytes |
558 // - data length, 4 bytes |