19#define __DCL_TRACE1_N __DCL_TRACE1
20#define __DCL_TRACE2_N __DCL_TRACE2
21#define __DCL_TRACE3_N __DCL_TRACE3
23#define __DCL_TRACE1_N(fmt, arg)
24#define __DCL_TRACE2_N(fmt, arg1, arg2)
25#define __DCL_TRACE3_N(fmt, arg1, arg2, arg3)
50 for (
size_t i = 0; i <
__items.size(); i++) {
55uint32_t APEv2::word(
const char _chars[4])
64bool APEv2::read(
File& _file,
const char _footerOr[32], File::off_t _off)
67 if (_footerOr ==
NULL) {
77 if (memcmp(
buf,
"APETAGEX", 8) == 0) {
83 if (memcmp(&
buf[128],
"APETAGEX", 8) == 0) {
84 _footerOr = &
buf[128];
90 if (_footerOr ==
NULL) {
101 if (_footerOr ==
NULL || memcmp(_footerOr,
"APETAGEX", 8) != 0) {
107 __size = word(&_footerOr[12]);
108 __count = word(&_footerOr[16]);
109 __flags = word(&_footerOr[20]);
127 const char* _begin =
__data;
128 const char* _end = _begin +
n;
130 if (
__flags & 0x80000000 && _begin + 32 <= _end) {
133 uint32_t version = word(_begin + 8);
134 uint32_t size = word(_begin + 12);
135 uint32_t count = word(_begin + 16);
136 uint32_t flags = word(_begin + 20);
138 String s = String::format(L
""
139 "Header[%ls] version[%d] size[%d] count[%d] flags[%x]",
141 version, size, count, flags
149 while (_begin + 8 < _end) {
150 APEv2Item* item =
new APEv2Item;
151 _begin += item->read(_begin, _end);
161 return String::format(L
""
162 "%ls version[%d] size[%d] count[%d] flags[%x]",
170APEv2Item::APEv2Item()
175size_t APEv2Item::read(
const char* _begin,
const char* _end)
179 __size = APEv2::word(_begin);
180 __flags = APEv2::word(_begin + 4);
184 int type = (
__flags & 0x0006) >> 1;
187 ByteString::length(_begin, _end - _begin));
188 _begin +=
__key.length() + 1;
190 if (_begin +
__size < _end) {
193 size_t n = ByteString::length(_begin,
__size);
195 __value = UTF8Decoder::decode(_begin,
n);
197 catch (CharsetConvertException* e) {
198 __DCL_TRACE0(L
"UTF8Decoder::decode failed. retry Latin1Decoder\n");
203 __key.data(), String::tryString(_begin,
__size).data()
212 __value = String::tryString(_begin,
213 ByteString::length(_begin,
__size));
226 sb.format(L
"size[%d] flags[%x] key[%ls] value[%ls]",
#define __DCL_TRACE1_N(fmt, arg)
#define __DCL_TRACE2_N(fmt, arg1, arg2)
#define __DCL_TRACE0(psz)
#define __DCL_TRACE3(fmt, arg1, arg2, arg3)
#define __DCL_ASSERT(expr)
#define IMPLEMENT_CLASSINFO(class_name, base_class_name)
void CharsetConvertException *size_t n
static String decode(const char *_mbs, size_t _mbslen=(size_t) -1)
String toStringAll() const
off_t seek(off_t _offset, int _whence) __DCL_THROWS1(IOException *)
virtual size_t read(void *_buf, size_t _n) __DCL_THROWS1(IOException *)
static String decode(const char *_mbs, size_t _nmbs=(size_t) -1)
virtual String toString() const