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