Go to the documentation of this file.00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028 #include "tag_impl.h"
00029 #include "helpers.h"
00030 #include "id3/io_decorators.h"
00031 #include "io_strings.h"
00032
00033 using namespace dami;
00034
00035 bool id3::v1::parse(ID3_TagImpl& tag, ID3_Reader& reader)
00036 {
00037 io::ExitTrigger et(reader);
00038
00039 ID3_Reader::pos_type end = reader.getCur();
00040
00041 if (end < reader.getBeg() + ID3_V1_LEN)
00042 {
00043 ID3D_NOTICE( "id3::v1::parse: not enough bytes to parse, pos = " << end );
00044 return false;
00045 }
00046 reader.setCur(end - ID3_V1_LEN);
00047 ID3_Reader::pos_type beg = reader.getCur();
00048
00049 if (end != beg + ID3_V1_LEN)
00050 {
00051 ID3D_WARNING( "id3::v1::parse: failed to reposition " << ID3_V1_LEN <<
00052 " bytes" );
00053 return false;
00054 }
00055
00056
00057 String field = io::readText(reader, ID3_V1_LEN_ID);
00058
00059
00060 if (field != "TAG")
00061 {
00062 return false;
00063 }
00064 et.setExitPos(beg);
00065
00066
00067
00068
00069
00070
00071
00072
00073
00074 ID3D_NOTICE("id3::v1::parse: read bytes: " << reader.getCur() - beg);
00075 String title = io::readTrailingSpaces(reader, ID3_V1_LEN_TITLE);
00076 field = id3::v2::getTitle(tag);
00077 if (title.size() > 0 && (field.size() == 0 || field == ""))
00078 {
00079 id3::v2::setTitle(tag, title);
00080 }
00081 ID3D_NOTICE( "id3::v1::parse: title = \"" << title << "\"" );
00082
00083 ID3D_NOTICE("id3::v1::parse: read bytes: " << reader.getCur() - beg);
00084 String artist = io::readTrailingSpaces(reader, ID3_V1_LEN_ARTIST);
00085 field = id3::v2::getArtist(tag);
00086 if (artist.size() > 0 && (field.size() == 0 || field == ""))
00087 {
00088 id3::v2::setArtist(tag, artist);
00089 }
00090 ID3D_NOTICE( "id3::v1::parse: artist = \"" << artist << "\"" );
00091
00092 ID3D_NOTICE("id3::v1::parse: read bytes: " << reader.getCur() - beg);
00093 String album = io::readTrailingSpaces(reader, ID3_V1_LEN_ALBUM);
00094 field = id3::v2::getAlbum(tag);
00095 if (album.size() > 0 && (field.size() == 0 || field == ""))
00096 {
00097 id3::v2::setAlbum(tag, album);
00098 }
00099 ID3D_NOTICE( "id3::v1::parse: album = \"" << title << "\"" );
00100
00101 ID3D_NOTICE("id3::v1::parse: read bytes: " << reader.getCur() - beg);
00102 String year = io::readTrailingSpaces(reader, ID3_V1_LEN_YEAR);
00103 field = id3::v2::getYear(tag);
00104 if (year.size() > 0 && (field.size() == 0 || field == ""))
00105 {
00106 id3::v2::setYear(tag, year);
00107 }
00108 ID3D_NOTICE( "id3::v1::parse: year = \"" << year << "\"" );
00109
00110 ID3D_NOTICE("id3::v1::parse: read bytes: " << reader.getCur() - beg);
00111 String comment = io::readTrailingSpaces(reader, ID3_V1_LEN_COMMENT-2);
00112
00113 BString trackno = io::readBinary(reader, ID3_V1_LEN_COMMENT-28);
00114 if (trackno[0] == '\0')
00115 {
00116 if (trackno[1] != '\0')
00117 {
00118 size_t track = trackno[1];
00119 field = id3::v2::getTrack(tag);
00120 if (field.size() == 0 || field == "00")
00121 {
00122 id3::v2::setTrack(tag, track, 0);
00123 }
00124 ID3D_NOTICE( "id3::v1::parse: track = \"" << track << "\"" );
00125 ID3D_NOTICE( "id3::v1::parse: comment length = \"" << comment.length() << "\"" );
00126 }
00127 }
00128 else
00129 {
00130
00131 const int paddingsize = (ID3_V1_LEN_COMMENT-2) - comment.size();
00132 const char * padding = " ";
00133
00134 if (trackno[1] == '\0' || trackno[1] == 0x20 && trackno[0] != 0x20)
00135 {
00136
00137 comment.append(padding, paddingsize);
00138 comment.append((const char *)trackno.data(), 1);
00139 }
00140 else if (trackno[1] != '\0' && trackno[1] != 0x20 && trackno[0] != 0x20)
00141 {
00142
00143 comment.append(padding, paddingsize);
00144 comment.append((const char *)trackno.data(), 2);
00145 }
00146 }
00147 ID3D_NOTICE( "id3::v1::parse: comment = \"" << comment << "\"" );
00148 if (comment.size() > 0)
00149 {
00150 id3::v2::setComment(tag, comment, STR_V1_COMMENT_DESC, "XXX");
00151 }
00152
00153 ID3D_NOTICE("id3::v1::parse: read bytes: " << reader.getCur() - beg);
00154
00155 uchar genre = reader.readChar();
00156 field = id3::v2::getGenre(tag);
00157 if (genre != 0xFF && (field.size() == 0 || field == ""))
00158 {
00159 id3::v2::setGenre(tag, genre);
00160 }
00161 ID3D_NOTICE( "id3::v1::parse: genre = \"" << (int) genre << "\"" );
00162
00163 ID3D_NOTICE("id3::v1::parse: read bytes: " << reader.getCur() - beg);
00164 return true;
00165 }
00166
00167