Mercurial > audlegacy
annotate src/libaudtag/ape/ape.c @ 4887:0ddbd0025174 default tip
added libaudtag. (not used yet.)
author | Yoshiki Yazawa <yaz@honeyplanet.jp> |
---|---|
date | Wed, 05 May 2010 18:26:06 +0900 |
parents | |
children |
rev | line source |
---|---|
4887
0ddbd0025174
added libaudtag. (not used yet.)
Yoshiki Yazawa <yaz@honeyplanet.jp>
parents:
diff
changeset
|
1 /* |
0ddbd0025174
added libaudtag. (not used yet.)
Yoshiki Yazawa <yaz@honeyplanet.jp>
parents:
diff
changeset
|
2 * Copyright 2010 John Lindgren |
0ddbd0025174
added libaudtag. (not used yet.)
Yoshiki Yazawa <yaz@honeyplanet.jp>
parents:
diff
changeset
|
3 * |
0ddbd0025174
added libaudtag. (not used yet.)
Yoshiki Yazawa <yaz@honeyplanet.jp>
parents:
diff
changeset
|
4 * This file is part of Audacious. |
0ddbd0025174
added libaudtag. (not used yet.)
Yoshiki Yazawa <yaz@honeyplanet.jp>
parents:
diff
changeset
|
5 * |
0ddbd0025174
added libaudtag. (not used yet.)
Yoshiki Yazawa <yaz@honeyplanet.jp>
parents:
diff
changeset
|
6 * Audacious is free software: you can redistribute it and/or modify it under |
0ddbd0025174
added libaudtag. (not used yet.)
Yoshiki Yazawa <yaz@honeyplanet.jp>
parents:
diff
changeset
|
7 * the terms of the GNU General Public License as published by the Free Software |
0ddbd0025174
added libaudtag. (not used yet.)
Yoshiki Yazawa <yaz@honeyplanet.jp>
parents:
diff
changeset
|
8 * Foundation, version 3 of the License. |
0ddbd0025174
added libaudtag. (not used yet.)
Yoshiki Yazawa <yaz@honeyplanet.jp>
parents:
diff
changeset
|
9 * |
0ddbd0025174
added libaudtag. (not used yet.)
Yoshiki Yazawa <yaz@honeyplanet.jp>
parents:
diff
changeset
|
10 * Audacious is distributed in the hope that it will be useful, but WITHOUT ANY |
0ddbd0025174
added libaudtag. (not used yet.)
Yoshiki Yazawa <yaz@honeyplanet.jp>
parents:
diff
changeset
|
11 * WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR |
0ddbd0025174
added libaudtag. (not used yet.)
Yoshiki Yazawa <yaz@honeyplanet.jp>
parents:
diff
changeset
|
12 * A PARTICULAR PURPOSE. See the GNU General Public License for more details. |
0ddbd0025174
added libaudtag. (not used yet.)
Yoshiki Yazawa <yaz@honeyplanet.jp>
parents:
diff
changeset
|
13 * |
0ddbd0025174
added libaudtag. (not used yet.)
Yoshiki Yazawa <yaz@honeyplanet.jp>
parents:
diff
changeset
|
14 * You should have received a copy of the GNU General Public License along with |
0ddbd0025174
added libaudtag. (not used yet.)
Yoshiki Yazawa <yaz@honeyplanet.jp>
parents:
diff
changeset
|
15 * Audacious. If not, see <http://www.gnu.org/licenses/>. |
0ddbd0025174
added libaudtag. (not used yet.)
Yoshiki Yazawa <yaz@honeyplanet.jp>
parents:
diff
changeset
|
16 * |
0ddbd0025174
added libaudtag. (not used yet.)
Yoshiki Yazawa <yaz@honeyplanet.jp>
parents:
diff
changeset
|
17 * The Audacious team does not consider modular code linking to Audacious or |
0ddbd0025174
added libaudtag. (not used yet.)
Yoshiki Yazawa <yaz@honeyplanet.jp>
parents:
diff
changeset
|
18 * using our public API to be a derived work. |
0ddbd0025174
added libaudtag. (not used yet.)
Yoshiki Yazawa <yaz@honeyplanet.jp>
parents:
diff
changeset
|
19 */ |
0ddbd0025174
added libaudtag. (not used yet.)
Yoshiki Yazawa <yaz@honeyplanet.jp>
parents:
diff
changeset
|
20 |
0ddbd0025174
added libaudtag. (not used yet.)
Yoshiki Yazawa <yaz@honeyplanet.jp>
parents:
diff
changeset
|
21 /* TODO: |
0ddbd0025174
added libaudtag. (not used yet.)
Yoshiki Yazawa <yaz@honeyplanet.jp>
parents:
diff
changeset
|
22 * - ReplayGain info |
0ddbd0025174
added libaudtag. (not used yet.)
Yoshiki Yazawa <yaz@honeyplanet.jp>
parents:
diff
changeset
|
23 * - Support updating files that have their tag at the beginning? |
0ddbd0025174
added libaudtag. (not used yet.)
Yoshiki Yazawa <yaz@honeyplanet.jp>
parents:
diff
changeset
|
24 */ |
0ddbd0025174
added libaudtag. (not used yet.)
Yoshiki Yazawa <yaz@honeyplanet.jp>
parents:
diff
changeset
|
25 |
0ddbd0025174
added libaudtag. (not used yet.)
Yoshiki Yazawa <yaz@honeyplanet.jp>
parents:
diff
changeset
|
26 #include <glib.h> |
0ddbd0025174
added libaudtag. (not used yet.)
Yoshiki Yazawa <yaz@honeyplanet.jp>
parents:
diff
changeset
|
27 #include <stdio.h> |
0ddbd0025174
added libaudtag. (not used yet.)
Yoshiki Yazawa <yaz@honeyplanet.jp>
parents:
diff
changeset
|
28 #include <stdlib.h> |
0ddbd0025174
added libaudtag. (not used yet.)
Yoshiki Yazawa <yaz@honeyplanet.jp>
parents:
diff
changeset
|
29 #include <string.h> |
0ddbd0025174
added libaudtag. (not used yet.)
Yoshiki Yazawa <yaz@honeyplanet.jp>
parents:
diff
changeset
|
30 |
0ddbd0025174
added libaudtag. (not used yet.)
Yoshiki Yazawa <yaz@honeyplanet.jp>
parents:
diff
changeset
|
31 #include <audlegacy/vfs.h> |
0ddbd0025174
added libaudtag. (not used yet.)
Yoshiki Yazawa <yaz@honeyplanet.jp>
parents:
diff
changeset
|
32 |
0ddbd0025174
added libaudtag. (not used yet.)
Yoshiki Yazawa <yaz@honeyplanet.jp>
parents:
diff
changeset
|
33 #include "ape.h" |
0ddbd0025174
added libaudtag. (not used yet.)
Yoshiki Yazawa <yaz@honeyplanet.jp>
parents:
diff
changeset
|
34 |
0ddbd0025174
added libaudtag. (not used yet.)
Yoshiki Yazawa <yaz@honeyplanet.jp>
parents:
diff
changeset
|
35 #define DEBUG(...) fprintf (stderr, "APE: " __VA_ARGS__) |
0ddbd0025174
added libaudtag. (not used yet.)
Yoshiki Yazawa <yaz@honeyplanet.jp>
parents:
diff
changeset
|
36 |
0ddbd0025174
added libaudtag. (not used yet.)
Yoshiki Yazawa <yaz@honeyplanet.jp>
parents:
diff
changeset
|
37 typedef struct |
0ddbd0025174
added libaudtag. (not used yet.)
Yoshiki Yazawa <yaz@honeyplanet.jp>
parents:
diff
changeset
|
38 { |
0ddbd0025174
added libaudtag. (not used yet.)
Yoshiki Yazawa <yaz@honeyplanet.jp>
parents:
diff
changeset
|
39 gchar magic[8]; |
0ddbd0025174
added libaudtag. (not used yet.)
Yoshiki Yazawa <yaz@honeyplanet.jp>
parents:
diff
changeset
|
40 guint32 version; /* LE */ |
0ddbd0025174
added libaudtag. (not used yet.)
Yoshiki Yazawa <yaz@honeyplanet.jp>
parents:
diff
changeset
|
41 guint32 length; /* LE */ |
0ddbd0025174
added libaudtag. (not used yet.)
Yoshiki Yazawa <yaz@honeyplanet.jp>
parents:
diff
changeset
|
42 guint32 items; /* LE */ |
0ddbd0025174
added libaudtag. (not used yet.)
Yoshiki Yazawa <yaz@honeyplanet.jp>
parents:
diff
changeset
|
43 guint32 flags; /* LE */ |
0ddbd0025174
added libaudtag. (not used yet.)
Yoshiki Yazawa <yaz@honeyplanet.jp>
parents:
diff
changeset
|
44 guint64 reserved; |
0ddbd0025174
added libaudtag. (not used yet.)
Yoshiki Yazawa <yaz@honeyplanet.jp>
parents:
diff
changeset
|
45 } |
0ddbd0025174
added libaudtag. (not used yet.)
Yoshiki Yazawa <yaz@honeyplanet.jp>
parents:
diff
changeset
|
46 APEHeader; |
0ddbd0025174
added libaudtag. (not used yet.)
Yoshiki Yazawa <yaz@honeyplanet.jp>
parents:
diff
changeset
|
47 |
0ddbd0025174
added libaudtag. (not used yet.)
Yoshiki Yazawa <yaz@honeyplanet.jp>
parents:
diff
changeset
|
48 typedef struct |
0ddbd0025174
added libaudtag. (not used yet.)
Yoshiki Yazawa <yaz@honeyplanet.jp>
parents:
diff
changeset
|
49 { |
0ddbd0025174
added libaudtag. (not used yet.)
Yoshiki Yazawa <yaz@honeyplanet.jp>
parents:
diff
changeset
|
50 gchar * key, * value; |
0ddbd0025174
added libaudtag. (not used yet.)
Yoshiki Yazawa <yaz@honeyplanet.jp>
parents:
diff
changeset
|
51 } |
0ddbd0025174
added libaudtag. (not used yet.)
Yoshiki Yazawa <yaz@honeyplanet.jp>
parents:
diff
changeset
|
52 ValuePair; |
0ddbd0025174
added libaudtag. (not used yet.)
Yoshiki Yazawa <yaz@honeyplanet.jp>
parents:
diff
changeset
|
53 |
0ddbd0025174
added libaudtag. (not used yet.)
Yoshiki Yazawa <yaz@honeyplanet.jp>
parents:
diff
changeset
|
54 #define APE_FLAG_HAS_HEADER (1 << 31) |
0ddbd0025174
added libaudtag. (not used yet.)
Yoshiki Yazawa <yaz@honeyplanet.jp>
parents:
diff
changeset
|
55 #define APE_FLAG_HAS_NO_FOOTER (1 << 30) |
0ddbd0025174
added libaudtag. (not used yet.)
Yoshiki Yazawa <yaz@honeyplanet.jp>
parents:
diff
changeset
|
56 #define APE_FLAG_IS_HEADER (1 << 29) |
0ddbd0025174
added libaudtag. (not used yet.)
Yoshiki Yazawa <yaz@honeyplanet.jp>
parents:
diff
changeset
|
57 |
0ddbd0025174
added libaudtag. (not used yet.)
Yoshiki Yazawa <yaz@honeyplanet.jp>
parents:
diff
changeset
|
58 static gboolean ape_read_header (VFSFile * handle, APEHeader * header) |
0ddbd0025174
added libaudtag. (not used yet.)
Yoshiki Yazawa <yaz@honeyplanet.jp>
parents:
diff
changeset
|
59 { |
0ddbd0025174
added libaudtag. (not used yet.)
Yoshiki Yazawa <yaz@honeyplanet.jp>
parents:
diff
changeset
|
60 if (vfs_fread (header, 1, sizeof (APEHeader), handle) != sizeof (APEHeader)) |
0ddbd0025174
added libaudtag. (not used yet.)
Yoshiki Yazawa <yaz@honeyplanet.jp>
parents:
diff
changeset
|
61 return FALSE; |
0ddbd0025174
added libaudtag. (not used yet.)
Yoshiki Yazawa <yaz@honeyplanet.jp>
parents:
diff
changeset
|
62 |
0ddbd0025174
added libaudtag. (not used yet.)
Yoshiki Yazawa <yaz@honeyplanet.jp>
parents:
diff
changeset
|
63 if (strncmp (header->magic, "APETAGEX", 8)) |
0ddbd0025174
added libaudtag. (not used yet.)
Yoshiki Yazawa <yaz@honeyplanet.jp>
parents:
diff
changeset
|
64 return FALSE; |
0ddbd0025174
added libaudtag. (not used yet.)
Yoshiki Yazawa <yaz@honeyplanet.jp>
parents:
diff
changeset
|
65 |
0ddbd0025174
added libaudtag. (not used yet.)
Yoshiki Yazawa <yaz@honeyplanet.jp>
parents:
diff
changeset
|
66 header->version = GUINT32_FROM_LE (header->version); |
0ddbd0025174
added libaudtag. (not used yet.)
Yoshiki Yazawa <yaz@honeyplanet.jp>
parents:
diff
changeset
|
67 header->length = GUINT32_FROM_LE (header->length); |
0ddbd0025174
added libaudtag. (not used yet.)
Yoshiki Yazawa <yaz@honeyplanet.jp>
parents:
diff
changeset
|
68 header->items = GUINT32_FROM_LE (header->items); |
0ddbd0025174
added libaudtag. (not used yet.)
Yoshiki Yazawa <yaz@honeyplanet.jp>
parents:
diff
changeset
|
69 header->flags = GUINT32_FROM_LE (header->flags); |
0ddbd0025174
added libaudtag. (not used yet.)
Yoshiki Yazawa <yaz@honeyplanet.jp>
parents:
diff
changeset
|
70 |
0ddbd0025174
added libaudtag. (not used yet.)
Yoshiki Yazawa <yaz@honeyplanet.jp>
parents:
diff
changeset
|
71 if (header->length < sizeof (APEHeader)) |
0ddbd0025174
added libaudtag. (not used yet.)
Yoshiki Yazawa <yaz@honeyplanet.jp>
parents:
diff
changeset
|
72 return FALSE; |
0ddbd0025174
added libaudtag. (not used yet.)
Yoshiki Yazawa <yaz@honeyplanet.jp>
parents:
diff
changeset
|
73 |
0ddbd0025174
added libaudtag. (not used yet.)
Yoshiki Yazawa <yaz@honeyplanet.jp>
parents:
diff
changeset
|
74 return TRUE; |
0ddbd0025174
added libaudtag. (not used yet.)
Yoshiki Yazawa <yaz@honeyplanet.jp>
parents:
diff
changeset
|
75 } |
0ddbd0025174
added libaudtag. (not used yet.)
Yoshiki Yazawa <yaz@honeyplanet.jp>
parents:
diff
changeset
|
76 |
0ddbd0025174
added libaudtag. (not used yet.)
Yoshiki Yazawa <yaz@honeyplanet.jp>
parents:
diff
changeset
|
77 static gboolean ape_find_header (VFSFile * handle, APEHeader * header, gint * |
0ddbd0025174
added libaudtag. (not used yet.)
Yoshiki Yazawa <yaz@honeyplanet.jp>
parents:
diff
changeset
|
78 start, gint * length, gint * data_start, gint * data_length) |
0ddbd0025174
added libaudtag. (not used yet.)
Yoshiki Yazawa <yaz@honeyplanet.jp>
parents:
diff
changeset
|
79 { |
0ddbd0025174
added libaudtag. (not used yet.)
Yoshiki Yazawa <yaz@honeyplanet.jp>
parents:
diff
changeset
|
80 APEHeader secondary; |
0ddbd0025174
added libaudtag. (not used yet.)
Yoshiki Yazawa <yaz@honeyplanet.jp>
parents:
diff
changeset
|
81 |
0ddbd0025174
added libaudtag. (not used yet.)
Yoshiki Yazawa <yaz@honeyplanet.jp>
parents:
diff
changeset
|
82 if (vfs_fseek (handle, 0, SEEK_SET)) |
0ddbd0025174
added libaudtag. (not used yet.)
Yoshiki Yazawa <yaz@honeyplanet.jp>
parents:
diff
changeset
|
83 return FALSE; |
0ddbd0025174
added libaudtag. (not used yet.)
Yoshiki Yazawa <yaz@honeyplanet.jp>
parents:
diff
changeset
|
84 |
0ddbd0025174
added libaudtag. (not used yet.)
Yoshiki Yazawa <yaz@honeyplanet.jp>
parents:
diff
changeset
|
85 if (ape_read_header (handle, header)) |
0ddbd0025174
added libaudtag. (not used yet.)
Yoshiki Yazawa <yaz@honeyplanet.jp>
parents:
diff
changeset
|
86 { |
0ddbd0025174
added libaudtag. (not used yet.)
Yoshiki Yazawa <yaz@honeyplanet.jp>
parents:
diff
changeset
|
87 DEBUG ("Found header at 0, length = %d, version = %d.\n", (gint) |
0ddbd0025174
added libaudtag. (not used yet.)
Yoshiki Yazawa <yaz@honeyplanet.jp>
parents:
diff
changeset
|
88 header->length, (gint) header->version); |
0ddbd0025174
added libaudtag. (not used yet.)
Yoshiki Yazawa <yaz@honeyplanet.jp>
parents:
diff
changeset
|
89 * start = 0; |
0ddbd0025174
added libaudtag. (not used yet.)
Yoshiki Yazawa <yaz@honeyplanet.jp>
parents:
diff
changeset
|
90 * length = header->length; |
0ddbd0025174
added libaudtag. (not used yet.)
Yoshiki Yazawa <yaz@honeyplanet.jp>
parents:
diff
changeset
|
91 * data_start = sizeof (APEHeader); |
0ddbd0025174
added libaudtag. (not used yet.)
Yoshiki Yazawa <yaz@honeyplanet.jp>
parents:
diff
changeset
|
92 * data_length = header->length - sizeof (APEHeader); |
0ddbd0025174
added libaudtag. (not used yet.)
Yoshiki Yazawa <yaz@honeyplanet.jp>
parents:
diff
changeset
|
93 |
0ddbd0025174
added libaudtag. (not used yet.)
Yoshiki Yazawa <yaz@honeyplanet.jp>
parents:
diff
changeset
|
94 if (! (header->flags & APE_FLAG_HAS_HEADER) || ! (header->flags & |
0ddbd0025174
added libaudtag. (not used yet.)
Yoshiki Yazawa <yaz@honeyplanet.jp>
parents:
diff
changeset
|
95 APE_FLAG_IS_HEADER)) |
0ddbd0025174
added libaudtag. (not used yet.)
Yoshiki Yazawa <yaz@honeyplanet.jp>
parents:
diff
changeset
|
96 { |
0ddbd0025174
added libaudtag. (not used yet.)
Yoshiki Yazawa <yaz@honeyplanet.jp>
parents:
diff
changeset
|
97 DEBUG ("Invalid header flags (%u).\n", (guint) header->flags); |
0ddbd0025174
added libaudtag. (not used yet.)
Yoshiki Yazawa <yaz@honeyplanet.jp>
parents:
diff
changeset
|
98 return FALSE; |
0ddbd0025174
added libaudtag. (not used yet.)
Yoshiki Yazawa <yaz@honeyplanet.jp>
parents:
diff
changeset
|
99 } |
0ddbd0025174
added libaudtag. (not used yet.)
Yoshiki Yazawa <yaz@honeyplanet.jp>
parents:
diff
changeset
|
100 |
0ddbd0025174
added libaudtag. (not used yet.)
Yoshiki Yazawa <yaz@honeyplanet.jp>
parents:
diff
changeset
|
101 if (! (header->flags & APE_FLAG_HAS_NO_FOOTER)) |
0ddbd0025174
added libaudtag. (not used yet.)
Yoshiki Yazawa <yaz@honeyplanet.jp>
parents:
diff
changeset
|
102 { |
0ddbd0025174
added libaudtag. (not used yet.)
Yoshiki Yazawa <yaz@honeyplanet.jp>
parents:
diff
changeset
|
103 if (vfs_fseek (handle, header->length, SEEK_CUR)) |
0ddbd0025174
added libaudtag. (not used yet.)
Yoshiki Yazawa <yaz@honeyplanet.jp>
parents:
diff
changeset
|
104 return FALSE; |
0ddbd0025174
added libaudtag. (not used yet.)
Yoshiki Yazawa <yaz@honeyplanet.jp>
parents:
diff
changeset
|
105 |
0ddbd0025174
added libaudtag. (not used yet.)
Yoshiki Yazawa <yaz@honeyplanet.jp>
parents:
diff
changeset
|
106 if (! ape_read_header (handle, & secondary)) |
0ddbd0025174
added libaudtag. (not used yet.)
Yoshiki Yazawa <yaz@honeyplanet.jp>
parents:
diff
changeset
|
107 { |
0ddbd0025174
added libaudtag. (not used yet.)
Yoshiki Yazawa <yaz@honeyplanet.jp>
parents:
diff
changeset
|
108 DEBUG ("Expected footer, but found none.\n"); |
0ddbd0025174
added libaudtag. (not used yet.)
Yoshiki Yazawa <yaz@honeyplanet.jp>
parents:
diff
changeset
|
109 return FALSE; |
0ddbd0025174
added libaudtag. (not used yet.)
Yoshiki Yazawa <yaz@honeyplanet.jp>
parents:
diff
changeset
|
110 } |
0ddbd0025174
added libaudtag. (not used yet.)
Yoshiki Yazawa <yaz@honeyplanet.jp>
parents:
diff
changeset
|
111 |
0ddbd0025174
added libaudtag. (not used yet.)
Yoshiki Yazawa <yaz@honeyplanet.jp>
parents:
diff
changeset
|
112 * length += sizeof (APEHeader); |
0ddbd0025174
added libaudtag. (not used yet.)
Yoshiki Yazawa <yaz@honeyplanet.jp>
parents:
diff
changeset
|
113 } |
0ddbd0025174
added libaudtag. (not used yet.)
Yoshiki Yazawa <yaz@honeyplanet.jp>
parents:
diff
changeset
|
114 |
0ddbd0025174
added libaudtag. (not used yet.)
Yoshiki Yazawa <yaz@honeyplanet.jp>
parents:
diff
changeset
|
115 return TRUE; |
0ddbd0025174
added libaudtag. (not used yet.)
Yoshiki Yazawa <yaz@honeyplanet.jp>
parents:
diff
changeset
|
116 } |
0ddbd0025174
added libaudtag. (not used yet.)
Yoshiki Yazawa <yaz@honeyplanet.jp>
parents:
diff
changeset
|
117 |
0ddbd0025174
added libaudtag. (not used yet.)
Yoshiki Yazawa <yaz@honeyplanet.jp>
parents:
diff
changeset
|
118 if (vfs_fseek (handle, -sizeof (APEHeader), SEEK_END)) |
0ddbd0025174
added libaudtag. (not used yet.)
Yoshiki Yazawa <yaz@honeyplanet.jp>
parents:
diff
changeset
|
119 return FALSE; |
0ddbd0025174
added libaudtag. (not used yet.)
Yoshiki Yazawa <yaz@honeyplanet.jp>
parents:
diff
changeset
|
120 |
0ddbd0025174
added libaudtag. (not used yet.)
Yoshiki Yazawa <yaz@honeyplanet.jp>
parents:
diff
changeset
|
121 if (ape_read_header (handle, header)) |
0ddbd0025174
added libaudtag. (not used yet.)
Yoshiki Yazawa <yaz@honeyplanet.jp>
parents:
diff
changeset
|
122 { |
0ddbd0025174
added libaudtag. (not used yet.)
Yoshiki Yazawa <yaz@honeyplanet.jp>
parents:
diff
changeset
|
123 DEBUG ("Found footer at %d, length = %d, version = %d.\n", (gint) |
0ddbd0025174
added libaudtag. (not used yet.)
Yoshiki Yazawa <yaz@honeyplanet.jp>
parents:
diff
changeset
|
124 vfs_ftell (handle) - (gint) sizeof (APEHeader), (gint) header->length, |
0ddbd0025174
added libaudtag. (not used yet.)
Yoshiki Yazawa <yaz@honeyplanet.jp>
parents:
diff
changeset
|
125 (gint) header->version); |
0ddbd0025174
added libaudtag. (not used yet.)
Yoshiki Yazawa <yaz@honeyplanet.jp>
parents:
diff
changeset
|
126 * start = vfs_ftell (handle) - header->length; |
0ddbd0025174
added libaudtag. (not used yet.)
Yoshiki Yazawa <yaz@honeyplanet.jp>
parents:
diff
changeset
|
127 * length = header->length; |
0ddbd0025174
added libaudtag. (not used yet.)
Yoshiki Yazawa <yaz@honeyplanet.jp>
parents:
diff
changeset
|
128 * data_start = vfs_ftell (handle) - header->length; |
0ddbd0025174
added libaudtag. (not used yet.)
Yoshiki Yazawa <yaz@honeyplanet.jp>
parents:
diff
changeset
|
129 * data_length = header->length - sizeof (APEHeader); |
0ddbd0025174
added libaudtag. (not used yet.)
Yoshiki Yazawa <yaz@honeyplanet.jp>
parents:
diff
changeset
|
130 |
0ddbd0025174
added libaudtag. (not used yet.)
Yoshiki Yazawa <yaz@honeyplanet.jp>
parents:
diff
changeset
|
131 if ((header->flags & APE_FLAG_HAS_NO_FOOTER) || (header->flags & |
0ddbd0025174
added libaudtag. (not used yet.)
Yoshiki Yazawa <yaz@honeyplanet.jp>
parents:
diff
changeset
|
132 APE_FLAG_IS_HEADER)) |
0ddbd0025174
added libaudtag. (not used yet.)
Yoshiki Yazawa <yaz@honeyplanet.jp>
parents:
diff
changeset
|
133 { |
0ddbd0025174
added libaudtag. (not used yet.)
Yoshiki Yazawa <yaz@honeyplanet.jp>
parents:
diff
changeset
|
134 DEBUG ("Invalid footer flags (%u).\n", (guint) header->flags); |
0ddbd0025174
added libaudtag. (not used yet.)
Yoshiki Yazawa <yaz@honeyplanet.jp>
parents:
diff
changeset
|
135 return FALSE; |
0ddbd0025174
added libaudtag. (not used yet.)
Yoshiki Yazawa <yaz@honeyplanet.jp>
parents:
diff
changeset
|
136 } |
0ddbd0025174
added libaudtag. (not used yet.)
Yoshiki Yazawa <yaz@honeyplanet.jp>
parents:
diff
changeset
|
137 |
0ddbd0025174
added libaudtag. (not used yet.)
Yoshiki Yazawa <yaz@honeyplanet.jp>
parents:
diff
changeset
|
138 if (header->flags & APE_FLAG_HAS_HEADER) |
0ddbd0025174
added libaudtag. (not used yet.)
Yoshiki Yazawa <yaz@honeyplanet.jp>
parents:
diff
changeset
|
139 { |
0ddbd0025174
added libaudtag. (not used yet.)
Yoshiki Yazawa <yaz@honeyplanet.jp>
parents:
diff
changeset
|
140 if (vfs_fseek (handle, -(gint) header->length - sizeof (APEHeader), |
0ddbd0025174
added libaudtag. (not used yet.)
Yoshiki Yazawa <yaz@honeyplanet.jp>
parents:
diff
changeset
|
141 SEEK_CUR)) |
0ddbd0025174
added libaudtag. (not used yet.)
Yoshiki Yazawa <yaz@honeyplanet.jp>
parents:
diff
changeset
|
142 return FALSE; |
0ddbd0025174
added libaudtag. (not used yet.)
Yoshiki Yazawa <yaz@honeyplanet.jp>
parents:
diff
changeset
|
143 |
0ddbd0025174
added libaudtag. (not used yet.)
Yoshiki Yazawa <yaz@honeyplanet.jp>
parents:
diff
changeset
|
144 if (! ape_read_header (handle, & secondary)) |
0ddbd0025174
added libaudtag. (not used yet.)
Yoshiki Yazawa <yaz@honeyplanet.jp>
parents:
diff
changeset
|
145 { |
0ddbd0025174
added libaudtag. (not used yet.)
Yoshiki Yazawa <yaz@honeyplanet.jp>
parents:
diff
changeset
|
146 DEBUG ("Expected header, but found none.\n"); |
0ddbd0025174
added libaudtag. (not used yet.)
Yoshiki Yazawa <yaz@honeyplanet.jp>
parents:
diff
changeset
|
147 return FALSE; |
0ddbd0025174
added libaudtag. (not used yet.)
Yoshiki Yazawa <yaz@honeyplanet.jp>
parents:
diff
changeset
|
148 } |
0ddbd0025174
added libaudtag. (not used yet.)
Yoshiki Yazawa <yaz@honeyplanet.jp>
parents:
diff
changeset
|
149 |
0ddbd0025174
added libaudtag. (not used yet.)
Yoshiki Yazawa <yaz@honeyplanet.jp>
parents:
diff
changeset
|
150 * start -= sizeof (APEHeader); |
0ddbd0025174
added libaudtag. (not used yet.)
Yoshiki Yazawa <yaz@honeyplanet.jp>
parents:
diff
changeset
|
151 * length += sizeof (APEHeader); |
0ddbd0025174
added libaudtag. (not used yet.)
Yoshiki Yazawa <yaz@honeyplanet.jp>
parents:
diff
changeset
|
152 } |
0ddbd0025174
added libaudtag. (not used yet.)
Yoshiki Yazawa <yaz@honeyplanet.jp>
parents:
diff
changeset
|
153 |
0ddbd0025174
added libaudtag. (not used yet.)
Yoshiki Yazawa <yaz@honeyplanet.jp>
parents:
diff
changeset
|
154 return TRUE; |
0ddbd0025174
added libaudtag. (not used yet.)
Yoshiki Yazawa <yaz@honeyplanet.jp>
parents:
diff
changeset
|
155 } |
0ddbd0025174
added libaudtag. (not used yet.)
Yoshiki Yazawa <yaz@honeyplanet.jp>
parents:
diff
changeset
|
156 |
0ddbd0025174
added libaudtag. (not used yet.)
Yoshiki Yazawa <yaz@honeyplanet.jp>
parents:
diff
changeset
|
157 DEBUG ("No header found.\n"); |
0ddbd0025174
added libaudtag. (not used yet.)
Yoshiki Yazawa <yaz@honeyplanet.jp>
parents:
diff
changeset
|
158 return FALSE; |
0ddbd0025174
added libaudtag. (not used yet.)
Yoshiki Yazawa <yaz@honeyplanet.jp>
parents:
diff
changeset
|
159 } |
0ddbd0025174
added libaudtag. (not used yet.)
Yoshiki Yazawa <yaz@honeyplanet.jp>
parents:
diff
changeset
|
160 |
0ddbd0025174
added libaudtag. (not used yet.)
Yoshiki Yazawa <yaz@honeyplanet.jp>
parents:
diff
changeset
|
161 static gboolean ape_is_our_file (VFSFile * handle) |
0ddbd0025174
added libaudtag. (not used yet.)
Yoshiki Yazawa <yaz@honeyplanet.jp>
parents:
diff
changeset
|
162 { |
0ddbd0025174
added libaudtag. (not used yet.)
Yoshiki Yazawa <yaz@honeyplanet.jp>
parents:
diff
changeset
|
163 APEHeader header; |
0ddbd0025174
added libaudtag. (not used yet.)
Yoshiki Yazawa <yaz@honeyplanet.jp>
parents:
diff
changeset
|
164 gint start, length, data_start, data_length; |
0ddbd0025174
added libaudtag. (not used yet.)
Yoshiki Yazawa <yaz@honeyplanet.jp>
parents:
diff
changeset
|
165 |
0ddbd0025174
added libaudtag. (not used yet.)
Yoshiki Yazawa <yaz@honeyplanet.jp>
parents:
diff
changeset
|
166 return ape_find_header (handle, & header, & start, & length, & data_start, |
0ddbd0025174
added libaudtag. (not used yet.)
Yoshiki Yazawa <yaz@honeyplanet.jp>
parents:
diff
changeset
|
167 & data_length); |
0ddbd0025174
added libaudtag. (not used yet.)
Yoshiki Yazawa <yaz@honeyplanet.jp>
parents:
diff
changeset
|
168 } |
0ddbd0025174
added libaudtag. (not used yet.)
Yoshiki Yazawa <yaz@honeyplanet.jp>
parents:
diff
changeset
|
169 |
0ddbd0025174
added libaudtag. (not used yet.)
Yoshiki Yazawa <yaz@honeyplanet.jp>
parents:
diff
changeset
|
170 static ValuePair * ape_read_item (void * * data, gint length) |
0ddbd0025174
added libaudtag. (not used yet.)
Yoshiki Yazawa <yaz@honeyplanet.jp>
parents:
diff
changeset
|
171 { |
0ddbd0025174
added libaudtag. (not used yet.)
Yoshiki Yazawa <yaz@honeyplanet.jp>
parents:
diff
changeset
|
172 guint32 * header = * data; |
0ddbd0025174
added libaudtag. (not used yet.)
Yoshiki Yazawa <yaz@honeyplanet.jp>
parents:
diff
changeset
|
173 gchar * value; |
0ddbd0025174
added libaudtag. (not used yet.)
Yoshiki Yazawa <yaz@honeyplanet.jp>
parents:
diff
changeset
|
174 ValuePair * pair; |
0ddbd0025174
added libaudtag. (not used yet.)
Yoshiki Yazawa <yaz@honeyplanet.jp>
parents:
diff
changeset
|
175 |
0ddbd0025174
added libaudtag. (not used yet.)
Yoshiki Yazawa <yaz@honeyplanet.jp>
parents:
diff
changeset
|
176 if (length < 8) |
0ddbd0025174
added libaudtag. (not used yet.)
Yoshiki Yazawa <yaz@honeyplanet.jp>
parents:
diff
changeset
|
177 { |
0ddbd0025174
added libaudtag. (not used yet.)
Yoshiki Yazawa <yaz@honeyplanet.jp>
parents:
diff
changeset
|
178 DEBUG ("Expected item, but only %d bytes remain in tag.\n", length); |
0ddbd0025174
added libaudtag. (not used yet.)
Yoshiki Yazawa <yaz@honeyplanet.jp>
parents:
diff
changeset
|
179 return NULL; |
0ddbd0025174
added libaudtag. (not used yet.)
Yoshiki Yazawa <yaz@honeyplanet.jp>
parents:
diff
changeset
|
180 } |
0ddbd0025174
added libaudtag. (not used yet.)
Yoshiki Yazawa <yaz@honeyplanet.jp>
parents:
diff
changeset
|
181 |
0ddbd0025174
added libaudtag. (not used yet.)
Yoshiki Yazawa <yaz@honeyplanet.jp>
parents:
diff
changeset
|
182 value = memchr ((gchar *) (* data) + 8, 0, length - 8); |
0ddbd0025174
added libaudtag. (not used yet.)
Yoshiki Yazawa <yaz@honeyplanet.jp>
parents:
diff
changeset
|
183 |
0ddbd0025174
added libaudtag. (not used yet.)
Yoshiki Yazawa <yaz@honeyplanet.jp>
parents:
diff
changeset
|
184 if (value == NULL) |
0ddbd0025174
added libaudtag. (not used yet.)
Yoshiki Yazawa <yaz@honeyplanet.jp>
parents:
diff
changeset
|
185 { |
0ddbd0025174
added libaudtag. (not used yet.)
Yoshiki Yazawa <yaz@honeyplanet.jp>
parents:
diff
changeset
|
186 DEBUG ("Unterminated item key (max length = %d).\n", length - 8); |
0ddbd0025174
added libaudtag. (not used yet.)
Yoshiki Yazawa <yaz@honeyplanet.jp>
parents:
diff
changeset
|
187 return NULL; |
0ddbd0025174
added libaudtag. (not used yet.)
Yoshiki Yazawa <yaz@honeyplanet.jp>
parents:
diff
changeset
|
188 } |
0ddbd0025174
added libaudtag. (not used yet.)
Yoshiki Yazawa <yaz@honeyplanet.jp>
parents:
diff
changeset
|
189 |
0ddbd0025174
added libaudtag. (not used yet.)
Yoshiki Yazawa <yaz@honeyplanet.jp>
parents:
diff
changeset
|
190 value ++; |
0ddbd0025174
added libaudtag. (not used yet.)
Yoshiki Yazawa <yaz@honeyplanet.jp>
parents:
diff
changeset
|
191 |
0ddbd0025174
added libaudtag. (not used yet.)
Yoshiki Yazawa <yaz@honeyplanet.jp>
parents:
diff
changeset
|
192 if (header[0] > (gchar *) (* data) + length - value) |
0ddbd0025174
added libaudtag. (not used yet.)
Yoshiki Yazawa <yaz@honeyplanet.jp>
parents:
diff
changeset
|
193 { |
0ddbd0025174
added libaudtag. (not used yet.)
Yoshiki Yazawa <yaz@honeyplanet.jp>
parents:
diff
changeset
|
194 DEBUG ("Item value of length %d, but only %d bytes remain in tag.\n", |
0ddbd0025174
added libaudtag. (not used yet.)
Yoshiki Yazawa <yaz@honeyplanet.jp>
parents:
diff
changeset
|
195 (gint) header[0], (gint) ((gchar *) (* data) + length - value)); |
0ddbd0025174
added libaudtag. (not used yet.)
Yoshiki Yazawa <yaz@honeyplanet.jp>
parents:
diff
changeset
|
196 return NULL; |
0ddbd0025174
added libaudtag. (not used yet.)
Yoshiki Yazawa <yaz@honeyplanet.jp>
parents:
diff
changeset
|
197 } |
0ddbd0025174
added libaudtag. (not used yet.)
Yoshiki Yazawa <yaz@honeyplanet.jp>
parents:
diff
changeset
|
198 |
0ddbd0025174
added libaudtag. (not used yet.)
Yoshiki Yazawa <yaz@honeyplanet.jp>
parents:
diff
changeset
|
199 pair = g_malloc (sizeof (ValuePair)); |
0ddbd0025174
added libaudtag. (not used yet.)
Yoshiki Yazawa <yaz@honeyplanet.jp>
parents:
diff
changeset
|
200 pair->key = g_strdup ((gchar *) (* data) + 8); |
0ddbd0025174
added libaudtag. (not used yet.)
Yoshiki Yazawa <yaz@honeyplanet.jp>
parents:
diff
changeset
|
201 pair->value = g_strndup (value, header[0]); |
0ddbd0025174
added libaudtag. (not used yet.)
Yoshiki Yazawa <yaz@honeyplanet.jp>
parents:
diff
changeset
|
202 |
0ddbd0025174
added libaudtag. (not used yet.)
Yoshiki Yazawa <yaz@honeyplanet.jp>
parents:
diff
changeset
|
203 * data = value + header[0]; |
0ddbd0025174
added libaudtag. (not used yet.)
Yoshiki Yazawa <yaz@honeyplanet.jp>
parents:
diff
changeset
|
204 |
0ddbd0025174
added libaudtag. (not used yet.)
Yoshiki Yazawa <yaz@honeyplanet.jp>
parents:
diff
changeset
|
205 return pair; |
0ddbd0025174
added libaudtag. (not used yet.)
Yoshiki Yazawa <yaz@honeyplanet.jp>
parents:
diff
changeset
|
206 } |
0ddbd0025174
added libaudtag. (not used yet.)
Yoshiki Yazawa <yaz@honeyplanet.jp>
parents:
diff
changeset
|
207 |
0ddbd0025174
added libaudtag. (not used yet.)
Yoshiki Yazawa <yaz@honeyplanet.jp>
parents:
diff
changeset
|
208 static GList * ape_read_tag (VFSFile * handle) |
0ddbd0025174
added libaudtag. (not used yet.)
Yoshiki Yazawa <yaz@honeyplanet.jp>
parents:
diff
changeset
|
209 { |
0ddbd0025174
added libaudtag. (not used yet.)
Yoshiki Yazawa <yaz@honeyplanet.jp>
parents:
diff
changeset
|
210 GList * list = NULL; |
0ddbd0025174
added libaudtag. (not used yet.)
Yoshiki Yazawa <yaz@honeyplanet.jp>
parents:
diff
changeset
|
211 APEHeader header; |
0ddbd0025174
added libaudtag. (not used yet.)
Yoshiki Yazawa <yaz@honeyplanet.jp>
parents:
diff
changeset
|
212 gint start, length, data_start, data_length; |
0ddbd0025174
added libaudtag. (not used yet.)
Yoshiki Yazawa <yaz@honeyplanet.jp>
parents:
diff
changeset
|
213 void * data, * item; |
0ddbd0025174
added libaudtag. (not used yet.)
Yoshiki Yazawa <yaz@honeyplanet.jp>
parents:
diff
changeset
|
214 |
0ddbd0025174
added libaudtag. (not used yet.)
Yoshiki Yazawa <yaz@honeyplanet.jp>
parents:
diff
changeset
|
215 if (! ape_find_header (handle, & header, & start, & length, & data_start, |
0ddbd0025174
added libaudtag. (not used yet.)
Yoshiki Yazawa <yaz@honeyplanet.jp>
parents:
diff
changeset
|
216 & data_length)) |
0ddbd0025174
added libaudtag. (not used yet.)
Yoshiki Yazawa <yaz@honeyplanet.jp>
parents:
diff
changeset
|
217 return NULL; |
0ddbd0025174
added libaudtag. (not used yet.)
Yoshiki Yazawa <yaz@honeyplanet.jp>
parents:
diff
changeset
|
218 |
0ddbd0025174
added libaudtag. (not used yet.)
Yoshiki Yazawa <yaz@honeyplanet.jp>
parents:
diff
changeset
|
219 if (vfs_fseek (handle, data_start, SEEK_SET)) |
0ddbd0025174
added libaudtag. (not used yet.)
Yoshiki Yazawa <yaz@honeyplanet.jp>
parents:
diff
changeset
|
220 return NULL; |
0ddbd0025174
added libaudtag. (not used yet.)
Yoshiki Yazawa <yaz@honeyplanet.jp>
parents:
diff
changeset
|
221 |
0ddbd0025174
added libaudtag. (not used yet.)
Yoshiki Yazawa <yaz@honeyplanet.jp>
parents:
diff
changeset
|
222 data = g_malloc (data_length); |
0ddbd0025174
added libaudtag. (not used yet.)
Yoshiki Yazawa <yaz@honeyplanet.jp>
parents:
diff
changeset
|
223 |
0ddbd0025174
added libaudtag. (not used yet.)
Yoshiki Yazawa <yaz@honeyplanet.jp>
parents:
diff
changeset
|
224 if (vfs_fread (data, 1, data_length, handle) != data_length) |
0ddbd0025174
added libaudtag. (not used yet.)
Yoshiki Yazawa <yaz@honeyplanet.jp>
parents:
diff
changeset
|
225 { |
0ddbd0025174
added libaudtag. (not used yet.)
Yoshiki Yazawa <yaz@honeyplanet.jp>
parents:
diff
changeset
|
226 g_free (data); |
0ddbd0025174
added libaudtag. (not used yet.)
Yoshiki Yazawa <yaz@honeyplanet.jp>
parents:
diff
changeset
|
227 return NULL; |
0ddbd0025174
added libaudtag. (not used yet.)
Yoshiki Yazawa <yaz@honeyplanet.jp>
parents:
diff
changeset
|
228 } |
0ddbd0025174
added libaudtag. (not used yet.)
Yoshiki Yazawa <yaz@honeyplanet.jp>
parents:
diff
changeset
|
229 |
0ddbd0025174
added libaudtag. (not used yet.)
Yoshiki Yazawa <yaz@honeyplanet.jp>
parents:
diff
changeset
|
230 DEBUG ("Reading %d items:\n", header.items); |
0ddbd0025174
added libaudtag. (not used yet.)
Yoshiki Yazawa <yaz@honeyplanet.jp>
parents:
diff
changeset
|
231 item = data; |
0ddbd0025174
added libaudtag. (not used yet.)
Yoshiki Yazawa <yaz@honeyplanet.jp>
parents:
diff
changeset
|
232 |
0ddbd0025174
added libaudtag. (not used yet.)
Yoshiki Yazawa <yaz@honeyplanet.jp>
parents:
diff
changeset
|
233 while (header.items --) |
0ddbd0025174
added libaudtag. (not used yet.)
Yoshiki Yazawa <yaz@honeyplanet.jp>
parents:
diff
changeset
|
234 { |
0ddbd0025174
added libaudtag. (not used yet.)
Yoshiki Yazawa <yaz@honeyplanet.jp>
parents:
diff
changeset
|
235 ValuePair * pair = ape_read_item (& item, (gchar *) data + data_length - |
0ddbd0025174
added libaudtag. (not used yet.)
Yoshiki Yazawa <yaz@honeyplanet.jp>
parents:
diff
changeset
|
236 (gchar *) item); |
0ddbd0025174
added libaudtag. (not used yet.)
Yoshiki Yazawa <yaz@honeyplanet.jp>
parents:
diff
changeset
|
237 |
0ddbd0025174
added libaudtag. (not used yet.)
Yoshiki Yazawa <yaz@honeyplanet.jp>
parents:
diff
changeset
|
238 if (pair == NULL) |
0ddbd0025174
added libaudtag. (not used yet.)
Yoshiki Yazawa <yaz@honeyplanet.jp>
parents:
diff
changeset
|
239 break; |
0ddbd0025174
added libaudtag. (not used yet.)
Yoshiki Yazawa <yaz@honeyplanet.jp>
parents:
diff
changeset
|
240 |
0ddbd0025174
added libaudtag. (not used yet.)
Yoshiki Yazawa <yaz@honeyplanet.jp>
parents:
diff
changeset
|
241 DEBUG ("Read: %s = %s.\n", pair->key, pair->value); |
0ddbd0025174
added libaudtag. (not used yet.)
Yoshiki Yazawa <yaz@honeyplanet.jp>
parents:
diff
changeset
|
242 list = g_list_prepend (list, pair); |
0ddbd0025174
added libaudtag. (not used yet.)
Yoshiki Yazawa <yaz@honeyplanet.jp>
parents:
diff
changeset
|
243 } |
0ddbd0025174
added libaudtag. (not used yet.)
Yoshiki Yazawa <yaz@honeyplanet.jp>
parents:
diff
changeset
|
244 |
0ddbd0025174
added libaudtag. (not used yet.)
Yoshiki Yazawa <yaz@honeyplanet.jp>
parents:
diff
changeset
|
245 g_free (data); |
0ddbd0025174
added libaudtag. (not used yet.)
Yoshiki Yazawa <yaz@honeyplanet.jp>
parents:
diff
changeset
|
246 return g_list_reverse (list); |
0ddbd0025174
added libaudtag. (not used yet.)
Yoshiki Yazawa <yaz@honeyplanet.jp>
parents:
diff
changeset
|
247 } |
0ddbd0025174
added libaudtag. (not used yet.)
Yoshiki Yazawa <yaz@honeyplanet.jp>
parents:
diff
changeset
|
248 |
0ddbd0025174
added libaudtag. (not used yet.)
Yoshiki Yazawa <yaz@honeyplanet.jp>
parents:
diff
changeset
|
249 static void free_tag_list (GList * list) |
0ddbd0025174
added libaudtag. (not used yet.)
Yoshiki Yazawa <yaz@honeyplanet.jp>
parents:
diff
changeset
|
250 { |
0ddbd0025174
added libaudtag. (not used yet.)
Yoshiki Yazawa <yaz@honeyplanet.jp>
parents:
diff
changeset
|
251 while (list != NULL) |
0ddbd0025174
added libaudtag. (not used yet.)
Yoshiki Yazawa <yaz@honeyplanet.jp>
parents:
diff
changeset
|
252 { |
0ddbd0025174
added libaudtag. (not used yet.)
Yoshiki Yazawa <yaz@honeyplanet.jp>
parents:
diff
changeset
|
253 g_free (((ValuePair *) list->data)->key); |
0ddbd0025174
added libaudtag. (not used yet.)
Yoshiki Yazawa <yaz@honeyplanet.jp>
parents:
diff
changeset
|
254 g_free (((ValuePair *) list->data)->value); |
0ddbd0025174
added libaudtag. (not used yet.)
Yoshiki Yazawa <yaz@honeyplanet.jp>
parents:
diff
changeset
|
255 g_free (list->data); |
0ddbd0025174
added libaudtag. (not used yet.)
Yoshiki Yazawa <yaz@honeyplanet.jp>
parents:
diff
changeset
|
256 list = g_list_delete_link (list, list); |
0ddbd0025174
added libaudtag. (not used yet.)
Yoshiki Yazawa <yaz@honeyplanet.jp>
parents:
diff
changeset
|
257 } |
0ddbd0025174
added libaudtag. (not used yet.)
Yoshiki Yazawa <yaz@honeyplanet.jp>
parents:
diff
changeset
|
258 } |
0ddbd0025174
added libaudtag. (not used yet.)
Yoshiki Yazawa <yaz@honeyplanet.jp>
parents:
diff
changeset
|
259 |
0ddbd0025174
added libaudtag. (not used yet.)
Yoshiki Yazawa <yaz@honeyplanet.jp>
parents:
diff
changeset
|
260 static Tuple * ape_fill_tuple (Tuple * tuple, VFSFile * handle) |
0ddbd0025174
added libaudtag. (not used yet.)
Yoshiki Yazawa <yaz@honeyplanet.jp>
parents:
diff
changeset
|
261 { |
0ddbd0025174
added libaudtag. (not used yet.)
Yoshiki Yazawa <yaz@honeyplanet.jp>
parents:
diff
changeset
|
262 GList * list = ape_read_tag (handle), * node; |
0ddbd0025174
added libaudtag. (not used yet.)
Yoshiki Yazawa <yaz@honeyplanet.jp>
parents:
diff
changeset
|
263 |
0ddbd0025174
added libaudtag. (not used yet.)
Yoshiki Yazawa <yaz@honeyplanet.jp>
parents:
diff
changeset
|
264 for (node = list; node != NULL; node = node->next) |
0ddbd0025174
added libaudtag. (not used yet.)
Yoshiki Yazawa <yaz@honeyplanet.jp>
parents:
diff
changeset
|
265 { |
0ddbd0025174
added libaudtag. (not used yet.)
Yoshiki Yazawa <yaz@honeyplanet.jp>
parents:
diff
changeset
|
266 gchar * key = ((ValuePair *) node->data)->key; |
0ddbd0025174
added libaudtag. (not used yet.)
Yoshiki Yazawa <yaz@honeyplanet.jp>
parents:
diff
changeset
|
267 gchar * value = ((ValuePair *) node->data)->value; |
0ddbd0025174
added libaudtag. (not used yet.)
Yoshiki Yazawa <yaz@honeyplanet.jp>
parents:
diff
changeset
|
268 |
0ddbd0025174
added libaudtag. (not used yet.)
Yoshiki Yazawa <yaz@honeyplanet.jp>
parents:
diff
changeset
|
269 if (! strcmp (key, "Artist")) |
0ddbd0025174
added libaudtag. (not used yet.)
Yoshiki Yazawa <yaz@honeyplanet.jp>
parents:
diff
changeset
|
270 tuple_associate_string (tuple, FIELD_ARTIST, NULL, value); |
0ddbd0025174
added libaudtag. (not used yet.)
Yoshiki Yazawa <yaz@honeyplanet.jp>
parents:
diff
changeset
|
271 else if (! strcmp (key, "Title")) |
0ddbd0025174
added libaudtag. (not used yet.)
Yoshiki Yazawa <yaz@honeyplanet.jp>
parents:
diff
changeset
|
272 tuple_associate_string (tuple, FIELD_TITLE, NULL, value); |
0ddbd0025174
added libaudtag. (not used yet.)
Yoshiki Yazawa <yaz@honeyplanet.jp>
parents:
diff
changeset
|
273 else if (! strcmp (key, "Album")) |
0ddbd0025174
added libaudtag. (not used yet.)
Yoshiki Yazawa <yaz@honeyplanet.jp>
parents:
diff
changeset
|
274 tuple_associate_string (tuple, FIELD_ALBUM, NULL, value); |
0ddbd0025174
added libaudtag. (not used yet.)
Yoshiki Yazawa <yaz@honeyplanet.jp>
parents:
diff
changeset
|
275 else if (! strcmp (key, "Comment")) |
0ddbd0025174
added libaudtag. (not used yet.)
Yoshiki Yazawa <yaz@honeyplanet.jp>
parents:
diff
changeset
|
276 tuple_associate_string (tuple, FIELD_COMMENT, NULL, value); |
0ddbd0025174
added libaudtag. (not used yet.)
Yoshiki Yazawa <yaz@honeyplanet.jp>
parents:
diff
changeset
|
277 else if (! strcmp (key, "Genre")) |
0ddbd0025174
added libaudtag. (not used yet.)
Yoshiki Yazawa <yaz@honeyplanet.jp>
parents:
diff
changeset
|
278 tuple_associate_string (tuple, FIELD_GENRE, NULL, value); |
0ddbd0025174
added libaudtag. (not used yet.)
Yoshiki Yazawa <yaz@honeyplanet.jp>
parents:
diff
changeset
|
279 else if (! strcmp (key, "Track")) |
0ddbd0025174
added libaudtag. (not used yet.)
Yoshiki Yazawa <yaz@honeyplanet.jp>
parents:
diff
changeset
|
280 tuple_associate_int (tuple, FIELD_TRACK_NUMBER, NULL, atoi (value)); |
0ddbd0025174
added libaudtag. (not used yet.)
Yoshiki Yazawa <yaz@honeyplanet.jp>
parents:
diff
changeset
|
281 else if (! strcmp (key, "Date")) |
0ddbd0025174
added libaudtag. (not used yet.)
Yoshiki Yazawa <yaz@honeyplanet.jp>
parents:
diff
changeset
|
282 tuple_associate_int (tuple, FIELD_YEAR, NULL, atoi (value)); |
0ddbd0025174
added libaudtag. (not used yet.)
Yoshiki Yazawa <yaz@honeyplanet.jp>
parents:
diff
changeset
|
283 } |
0ddbd0025174
added libaudtag. (not used yet.)
Yoshiki Yazawa <yaz@honeyplanet.jp>
parents:
diff
changeset
|
284 |
0ddbd0025174
added libaudtag. (not used yet.)
Yoshiki Yazawa <yaz@honeyplanet.jp>
parents:
diff
changeset
|
285 free_tag_list (list); |
0ddbd0025174
added libaudtag. (not used yet.)
Yoshiki Yazawa <yaz@honeyplanet.jp>
parents:
diff
changeset
|
286 return tuple; |
0ddbd0025174
added libaudtag. (not used yet.)
Yoshiki Yazawa <yaz@honeyplanet.jp>
parents:
diff
changeset
|
287 } |
0ddbd0025174
added libaudtag. (not used yet.)
Yoshiki Yazawa <yaz@honeyplanet.jp>
parents:
diff
changeset
|
288 |
0ddbd0025174
added libaudtag. (not used yet.)
Yoshiki Yazawa <yaz@honeyplanet.jp>
parents:
diff
changeset
|
289 static gboolean ape_write_item (VFSFile * handle, const gchar * key, |
0ddbd0025174
added libaudtag. (not used yet.)
Yoshiki Yazawa <yaz@honeyplanet.jp>
parents:
diff
changeset
|
290 const gchar * value, int * written_length) |
0ddbd0025174
added libaudtag. (not used yet.)
Yoshiki Yazawa <yaz@honeyplanet.jp>
parents:
diff
changeset
|
291 { |
0ddbd0025174
added libaudtag. (not used yet.)
Yoshiki Yazawa <yaz@honeyplanet.jp>
parents:
diff
changeset
|
292 gint key_len = strlen (key) + 1; |
0ddbd0025174
added libaudtag. (not used yet.)
Yoshiki Yazawa <yaz@honeyplanet.jp>
parents:
diff
changeset
|
293 gint value_len = strlen (value); |
0ddbd0025174
added libaudtag. (not used yet.)
Yoshiki Yazawa <yaz@honeyplanet.jp>
parents:
diff
changeset
|
294 guint32 header[2]; |
0ddbd0025174
added libaudtag. (not used yet.)
Yoshiki Yazawa <yaz@honeyplanet.jp>
parents:
diff
changeset
|
295 |
0ddbd0025174
added libaudtag. (not used yet.)
Yoshiki Yazawa <yaz@honeyplanet.jp>
parents:
diff
changeset
|
296 DEBUG ("Write: %s = %s.\n", key, value); |
0ddbd0025174
added libaudtag. (not used yet.)
Yoshiki Yazawa <yaz@honeyplanet.jp>
parents:
diff
changeset
|
297 |
0ddbd0025174
added libaudtag. (not used yet.)
Yoshiki Yazawa <yaz@honeyplanet.jp>
parents:
diff
changeset
|
298 header[0] = GUINT32_TO_LE (value_len); |
0ddbd0025174
added libaudtag. (not used yet.)
Yoshiki Yazawa <yaz@honeyplanet.jp>
parents:
diff
changeset
|
299 header[1] = 0; |
0ddbd0025174
added libaudtag. (not used yet.)
Yoshiki Yazawa <yaz@honeyplanet.jp>
parents:
diff
changeset
|
300 |
0ddbd0025174
added libaudtag. (not used yet.)
Yoshiki Yazawa <yaz@honeyplanet.jp>
parents:
diff
changeset
|
301 if (vfs_fwrite (header, 1, 8, handle) != 8) |
0ddbd0025174
added libaudtag. (not used yet.)
Yoshiki Yazawa <yaz@honeyplanet.jp>
parents:
diff
changeset
|
302 return FALSE; |
0ddbd0025174
added libaudtag. (not used yet.)
Yoshiki Yazawa <yaz@honeyplanet.jp>
parents:
diff
changeset
|
303 |
0ddbd0025174
added libaudtag. (not used yet.)
Yoshiki Yazawa <yaz@honeyplanet.jp>
parents:
diff
changeset
|
304 if (vfs_fwrite (key, 1, key_len, handle) != key_len) |
0ddbd0025174
added libaudtag. (not used yet.)
Yoshiki Yazawa <yaz@honeyplanet.jp>
parents:
diff
changeset
|
305 return FALSE; |
0ddbd0025174
added libaudtag. (not used yet.)
Yoshiki Yazawa <yaz@honeyplanet.jp>
parents:
diff
changeset
|
306 |
0ddbd0025174
added libaudtag. (not used yet.)
Yoshiki Yazawa <yaz@honeyplanet.jp>
parents:
diff
changeset
|
307 if (vfs_fwrite (value, 1, value_len, handle) != value_len) |
0ddbd0025174
added libaudtag. (not used yet.)
Yoshiki Yazawa <yaz@honeyplanet.jp>
parents:
diff
changeset
|
308 return FALSE; |
0ddbd0025174
added libaudtag. (not used yet.)
Yoshiki Yazawa <yaz@honeyplanet.jp>
parents:
diff
changeset
|
309 |
0ddbd0025174
added libaudtag. (not used yet.)
Yoshiki Yazawa <yaz@honeyplanet.jp>
parents:
diff
changeset
|
310 * written_length += 8 + key_len + value_len; |
0ddbd0025174
added libaudtag. (not used yet.)
Yoshiki Yazawa <yaz@honeyplanet.jp>
parents:
diff
changeset
|
311 return TRUE; |
0ddbd0025174
added libaudtag. (not used yet.)
Yoshiki Yazawa <yaz@honeyplanet.jp>
parents:
diff
changeset
|
312 } |
0ddbd0025174
added libaudtag. (not used yet.)
Yoshiki Yazawa <yaz@honeyplanet.jp>
parents:
diff
changeset
|
313 |
0ddbd0025174
added libaudtag. (not used yet.)
Yoshiki Yazawa <yaz@honeyplanet.jp>
parents:
diff
changeset
|
314 static gboolean write_string_item (Tuple * tuple, int field, VFSFile * handle, |
0ddbd0025174
added libaudtag. (not used yet.)
Yoshiki Yazawa <yaz@honeyplanet.jp>
parents:
diff
changeset
|
315 const gchar * key, int * written_length, int * written_items) |
0ddbd0025174
added libaudtag. (not used yet.)
Yoshiki Yazawa <yaz@honeyplanet.jp>
parents:
diff
changeset
|
316 { |
0ddbd0025174
added libaudtag. (not used yet.)
Yoshiki Yazawa <yaz@honeyplanet.jp>
parents:
diff
changeset
|
317 const gchar * value = tuple_get_string (tuple, field, NULL); |
0ddbd0025174
added libaudtag. (not used yet.)
Yoshiki Yazawa <yaz@honeyplanet.jp>
parents:
diff
changeset
|
318 |
0ddbd0025174
added libaudtag. (not used yet.)
Yoshiki Yazawa <yaz@honeyplanet.jp>
parents:
diff
changeset
|
319 if (value == NULL) |
0ddbd0025174
added libaudtag. (not used yet.)
Yoshiki Yazawa <yaz@honeyplanet.jp>
parents:
diff
changeset
|
320 return TRUE; |
0ddbd0025174
added libaudtag. (not used yet.)
Yoshiki Yazawa <yaz@honeyplanet.jp>
parents:
diff
changeset
|
321 |
0ddbd0025174
added libaudtag. (not used yet.)
Yoshiki Yazawa <yaz@honeyplanet.jp>
parents:
diff
changeset
|
322 if (! ape_write_item (handle, key, value, written_length)) |
0ddbd0025174
added libaudtag. (not used yet.)
Yoshiki Yazawa <yaz@honeyplanet.jp>
parents:
diff
changeset
|
323 return FALSE; |
0ddbd0025174
added libaudtag. (not used yet.)
Yoshiki Yazawa <yaz@honeyplanet.jp>
parents:
diff
changeset
|
324 |
0ddbd0025174
added libaudtag. (not used yet.)
Yoshiki Yazawa <yaz@honeyplanet.jp>
parents:
diff
changeset
|
325 (* written_items) ++; |
0ddbd0025174
added libaudtag. (not used yet.)
Yoshiki Yazawa <yaz@honeyplanet.jp>
parents:
diff
changeset
|
326 return TRUE; |
0ddbd0025174
added libaudtag. (not used yet.)
Yoshiki Yazawa <yaz@honeyplanet.jp>
parents:
diff
changeset
|
327 } |
0ddbd0025174
added libaudtag. (not used yet.)
Yoshiki Yazawa <yaz@honeyplanet.jp>
parents:
diff
changeset
|
328 |
0ddbd0025174
added libaudtag. (not used yet.)
Yoshiki Yazawa <yaz@honeyplanet.jp>
parents:
diff
changeset
|
329 static gboolean write_integer_item (Tuple * tuple, int field, VFSFile * handle, |
0ddbd0025174
added libaudtag. (not used yet.)
Yoshiki Yazawa <yaz@honeyplanet.jp>
parents:
diff
changeset
|
330 const gchar * key, int * written_length, int * written_items) |
0ddbd0025174
added libaudtag. (not used yet.)
Yoshiki Yazawa <yaz@honeyplanet.jp>
parents:
diff
changeset
|
331 { |
0ddbd0025174
added libaudtag. (not used yet.)
Yoshiki Yazawa <yaz@honeyplanet.jp>
parents:
diff
changeset
|
332 gint value = tuple_get_int (tuple, field, NULL); |
0ddbd0025174
added libaudtag. (not used yet.)
Yoshiki Yazawa <yaz@honeyplanet.jp>
parents:
diff
changeset
|
333 gchar scratch[32]; |
0ddbd0025174
added libaudtag. (not used yet.)
Yoshiki Yazawa <yaz@honeyplanet.jp>
parents:
diff
changeset
|
334 |
0ddbd0025174
added libaudtag. (not used yet.)
Yoshiki Yazawa <yaz@honeyplanet.jp>
parents:
diff
changeset
|
335 if (! value) |
0ddbd0025174
added libaudtag. (not used yet.)
Yoshiki Yazawa <yaz@honeyplanet.jp>
parents:
diff
changeset
|
336 return TRUE; |
0ddbd0025174
added libaudtag. (not used yet.)
Yoshiki Yazawa <yaz@honeyplanet.jp>
parents:
diff
changeset
|
337 |
0ddbd0025174
added libaudtag. (not used yet.)
Yoshiki Yazawa <yaz@honeyplanet.jp>
parents:
diff
changeset
|
338 snprintf (scratch, sizeof scratch, "%d", value); |
0ddbd0025174
added libaudtag. (not used yet.)
Yoshiki Yazawa <yaz@honeyplanet.jp>
parents:
diff
changeset
|
339 |
0ddbd0025174
added libaudtag. (not used yet.)
Yoshiki Yazawa <yaz@honeyplanet.jp>
parents:
diff
changeset
|
340 if (! ape_write_item (handle, key, scratch, written_length)) |
0ddbd0025174
added libaudtag. (not used yet.)
Yoshiki Yazawa <yaz@honeyplanet.jp>
parents:
diff
changeset
|
341 return FALSE; |
0ddbd0025174
added libaudtag. (not used yet.)
Yoshiki Yazawa <yaz@honeyplanet.jp>
parents:
diff
changeset
|
342 |
0ddbd0025174
added libaudtag. (not used yet.)
Yoshiki Yazawa <yaz@honeyplanet.jp>
parents:
diff
changeset
|
343 (* written_items) ++; |
0ddbd0025174
added libaudtag. (not used yet.)
Yoshiki Yazawa <yaz@honeyplanet.jp>
parents:
diff
changeset
|
344 return TRUE; |
0ddbd0025174
added libaudtag. (not used yet.)
Yoshiki Yazawa <yaz@honeyplanet.jp>
parents:
diff
changeset
|
345 } |
0ddbd0025174
added libaudtag. (not used yet.)
Yoshiki Yazawa <yaz@honeyplanet.jp>
parents:
diff
changeset
|
346 |
0ddbd0025174
added libaudtag. (not used yet.)
Yoshiki Yazawa <yaz@honeyplanet.jp>
parents:
diff
changeset
|
347 static gboolean write_header (gint data_length, gint items, gboolean is_header, |
0ddbd0025174
added libaudtag. (not used yet.)
Yoshiki Yazawa <yaz@honeyplanet.jp>
parents:
diff
changeset
|
348 VFSFile * handle) |
0ddbd0025174
added libaudtag. (not used yet.)
Yoshiki Yazawa <yaz@honeyplanet.jp>
parents:
diff
changeset
|
349 { |
0ddbd0025174
added libaudtag. (not used yet.)
Yoshiki Yazawa <yaz@honeyplanet.jp>
parents:
diff
changeset
|
350 APEHeader header; |
0ddbd0025174
added libaudtag. (not used yet.)
Yoshiki Yazawa <yaz@honeyplanet.jp>
parents:
diff
changeset
|
351 |
0ddbd0025174
added libaudtag. (not used yet.)
Yoshiki Yazawa <yaz@honeyplanet.jp>
parents:
diff
changeset
|
352 memcpy (header.magic, "APETAGEX", 8); |
0ddbd0025174
added libaudtag. (not used yet.)
Yoshiki Yazawa <yaz@honeyplanet.jp>
parents:
diff
changeset
|
353 header.version = GUINT32_TO_LE (2000); |
0ddbd0025174
added libaudtag. (not used yet.)
Yoshiki Yazawa <yaz@honeyplanet.jp>
parents:
diff
changeset
|
354 header.length = GUINT32_TO_LE (data_length + sizeof (APEHeader)); |
0ddbd0025174
added libaudtag. (not used yet.)
Yoshiki Yazawa <yaz@honeyplanet.jp>
parents:
diff
changeset
|
355 header.items = GUINT32_TO_LE (items); |
0ddbd0025174
added libaudtag. (not used yet.)
Yoshiki Yazawa <yaz@honeyplanet.jp>
parents:
diff
changeset
|
356 header.flags = is_header ? GUINT32_TO_LE (APE_FLAG_HAS_HEADER | |
0ddbd0025174
added libaudtag. (not used yet.)
Yoshiki Yazawa <yaz@honeyplanet.jp>
parents:
diff
changeset
|
357 APE_FLAG_IS_HEADER) : GUINT32_TO_LE (APE_FLAG_HAS_HEADER); |
0ddbd0025174
added libaudtag. (not used yet.)
Yoshiki Yazawa <yaz@honeyplanet.jp>
parents:
diff
changeset
|
358 header.reserved = 0; |
0ddbd0025174
added libaudtag. (not used yet.)
Yoshiki Yazawa <yaz@honeyplanet.jp>
parents:
diff
changeset
|
359 |
0ddbd0025174
added libaudtag. (not used yet.)
Yoshiki Yazawa <yaz@honeyplanet.jp>
parents:
diff
changeset
|
360 return vfs_fwrite (& header, 1, sizeof (APEHeader), handle) == sizeof |
0ddbd0025174
added libaudtag. (not used yet.)
Yoshiki Yazawa <yaz@honeyplanet.jp>
parents:
diff
changeset
|
361 (APEHeader); |
0ddbd0025174
added libaudtag. (not used yet.)
Yoshiki Yazawa <yaz@honeyplanet.jp>
parents:
diff
changeset
|
362 } |
0ddbd0025174
added libaudtag. (not used yet.)
Yoshiki Yazawa <yaz@honeyplanet.jp>
parents:
diff
changeset
|
363 |
0ddbd0025174
added libaudtag. (not used yet.)
Yoshiki Yazawa <yaz@honeyplanet.jp>
parents:
diff
changeset
|
364 static gboolean ape_write_tag (Tuple * tuple, VFSFile * handle) |
0ddbd0025174
added libaudtag. (not used yet.)
Yoshiki Yazawa <yaz@honeyplanet.jp>
parents:
diff
changeset
|
365 { |
0ddbd0025174
added libaudtag. (not used yet.)
Yoshiki Yazawa <yaz@honeyplanet.jp>
parents:
diff
changeset
|
366 GList * list = ape_read_tag (handle), * node; |
0ddbd0025174
added libaudtag. (not used yet.)
Yoshiki Yazawa <yaz@honeyplanet.jp>
parents:
diff
changeset
|
367 APEHeader header; |
0ddbd0025174
added libaudtag. (not used yet.)
Yoshiki Yazawa <yaz@honeyplanet.jp>
parents:
diff
changeset
|
368 gint start, length, data_start, data_length, items; |
0ddbd0025174
added libaudtag. (not used yet.)
Yoshiki Yazawa <yaz@honeyplanet.jp>
parents:
diff
changeset
|
369 |
0ddbd0025174
added libaudtag. (not used yet.)
Yoshiki Yazawa <yaz@honeyplanet.jp>
parents:
diff
changeset
|
370 if (! ape_find_header (handle, & header, & start, & length, & data_start, |
0ddbd0025174
added libaudtag. (not used yet.)
Yoshiki Yazawa <yaz@honeyplanet.jp>
parents:
diff
changeset
|
371 & data_length)) |
0ddbd0025174
added libaudtag. (not used yet.)
Yoshiki Yazawa <yaz@honeyplanet.jp>
parents:
diff
changeset
|
372 goto ERROR; |
0ddbd0025174
added libaudtag. (not used yet.)
Yoshiki Yazawa <yaz@honeyplanet.jp>
parents:
diff
changeset
|
373 |
0ddbd0025174
added libaudtag. (not used yet.)
Yoshiki Yazawa <yaz@honeyplanet.jp>
parents:
diff
changeset
|
374 if (start + length != vfs_fsize (handle)) |
0ddbd0025174
added libaudtag. (not used yet.)
Yoshiki Yazawa <yaz@honeyplanet.jp>
parents:
diff
changeset
|
375 { |
0ddbd0025174
added libaudtag. (not used yet.)
Yoshiki Yazawa <yaz@honeyplanet.jp>
parents:
diff
changeset
|
376 DEBUG ("Writing tags is only supported at end of file.\n"); |
0ddbd0025174
added libaudtag. (not used yet.)
Yoshiki Yazawa <yaz@honeyplanet.jp>
parents:
diff
changeset
|
377 goto ERROR; |
0ddbd0025174
added libaudtag. (not used yet.)
Yoshiki Yazawa <yaz@honeyplanet.jp>
parents:
diff
changeset
|
378 } |
0ddbd0025174
added libaudtag. (not used yet.)
Yoshiki Yazawa <yaz@honeyplanet.jp>
parents:
diff
changeset
|
379 |
0ddbd0025174
added libaudtag. (not used yet.)
Yoshiki Yazawa <yaz@honeyplanet.jp>
parents:
diff
changeset
|
380 if (vfs_truncate (handle, start) || vfs_fseek (handle, start, SEEK_SET) || |
0ddbd0025174
added libaudtag. (not used yet.)
Yoshiki Yazawa <yaz@honeyplanet.jp>
parents:
diff
changeset
|
381 ! write_header (0, 0, TRUE, handle)) |
0ddbd0025174
added libaudtag. (not used yet.)
Yoshiki Yazawa <yaz@honeyplanet.jp>
parents:
diff
changeset
|
382 goto ERROR; |
0ddbd0025174
added libaudtag. (not used yet.)
Yoshiki Yazawa <yaz@honeyplanet.jp>
parents:
diff
changeset
|
383 |
0ddbd0025174
added libaudtag. (not used yet.)
Yoshiki Yazawa <yaz@honeyplanet.jp>
parents:
diff
changeset
|
384 length = 0; |
0ddbd0025174
added libaudtag. (not used yet.)
Yoshiki Yazawa <yaz@honeyplanet.jp>
parents:
diff
changeset
|
385 items = 0; |
0ddbd0025174
added libaudtag. (not used yet.)
Yoshiki Yazawa <yaz@honeyplanet.jp>
parents:
diff
changeset
|
386 |
0ddbd0025174
added libaudtag. (not used yet.)
Yoshiki Yazawa <yaz@honeyplanet.jp>
parents:
diff
changeset
|
387 if (! write_string_item (tuple, FIELD_ARTIST, handle, "Artist", & length, |
0ddbd0025174
added libaudtag. (not used yet.)
Yoshiki Yazawa <yaz@honeyplanet.jp>
parents:
diff
changeset
|
388 & items) || ! write_string_item (tuple, FIELD_TITLE, handle, "Title", |
0ddbd0025174
added libaudtag. (not used yet.)
Yoshiki Yazawa <yaz@honeyplanet.jp>
parents:
diff
changeset
|
389 & length, & items) || ! write_string_item (tuple, FIELD_ALBUM, handle, |
0ddbd0025174
added libaudtag. (not used yet.)
Yoshiki Yazawa <yaz@honeyplanet.jp>
parents:
diff
changeset
|
390 "Album", & length, & items) || ! write_string_item (tuple, FIELD_COMMENT, |
0ddbd0025174
added libaudtag. (not used yet.)
Yoshiki Yazawa <yaz@honeyplanet.jp>
parents:
diff
changeset
|
391 handle, "Comment", & length, & items) || ! write_string_item (tuple, |
0ddbd0025174
added libaudtag. (not used yet.)
Yoshiki Yazawa <yaz@honeyplanet.jp>
parents:
diff
changeset
|
392 FIELD_GENRE, handle, "Genre", & length, & items) || ! write_integer_item |
0ddbd0025174
added libaudtag. (not used yet.)
Yoshiki Yazawa <yaz@honeyplanet.jp>
parents:
diff
changeset
|
393 (tuple, FIELD_TRACK_NUMBER, handle, "Track", & length, & items) || |
0ddbd0025174
added libaudtag. (not used yet.)
Yoshiki Yazawa <yaz@honeyplanet.jp>
parents:
diff
changeset
|
394 ! write_integer_item (tuple, FIELD_YEAR, handle, "Date", & length, & items)) |
0ddbd0025174
added libaudtag. (not used yet.)
Yoshiki Yazawa <yaz@honeyplanet.jp>
parents:
diff
changeset
|
395 goto ERROR; |
0ddbd0025174
added libaudtag. (not used yet.)
Yoshiki Yazawa <yaz@honeyplanet.jp>
parents:
diff
changeset
|
396 |
0ddbd0025174
added libaudtag. (not used yet.)
Yoshiki Yazawa <yaz@honeyplanet.jp>
parents:
diff
changeset
|
397 for (node = list; node != NULL; node = node->next) |
0ddbd0025174
added libaudtag. (not used yet.)
Yoshiki Yazawa <yaz@honeyplanet.jp>
parents:
diff
changeset
|
398 { |
0ddbd0025174
added libaudtag. (not used yet.)
Yoshiki Yazawa <yaz@honeyplanet.jp>
parents:
diff
changeset
|
399 gchar * key = ((ValuePair *) node->data)->key; |
0ddbd0025174
added libaudtag. (not used yet.)
Yoshiki Yazawa <yaz@honeyplanet.jp>
parents:
diff
changeset
|
400 gchar * value = ((ValuePair *) node->data)->value; |
0ddbd0025174
added libaudtag. (not used yet.)
Yoshiki Yazawa <yaz@honeyplanet.jp>
parents:
diff
changeset
|
401 |
0ddbd0025174
added libaudtag. (not used yet.)
Yoshiki Yazawa <yaz@honeyplanet.jp>
parents:
diff
changeset
|
402 if (! strcmp (key, "Artist") || ! strcmp (key, "Title") || ! strcmp |
0ddbd0025174
added libaudtag. (not used yet.)
Yoshiki Yazawa <yaz@honeyplanet.jp>
parents:
diff
changeset
|
403 (key, "Album") || ! strcmp (key, "Comment") || ! strcmp (key, "Genre") |
0ddbd0025174
added libaudtag. (not used yet.)
Yoshiki Yazawa <yaz@honeyplanet.jp>
parents:
diff
changeset
|
404 || ! strcmp (key, "Track") || ! strcmp (key, "Date")) |
0ddbd0025174
added libaudtag. (not used yet.)
Yoshiki Yazawa <yaz@honeyplanet.jp>
parents:
diff
changeset
|
405 continue; |
0ddbd0025174
added libaudtag. (not used yet.)
Yoshiki Yazawa <yaz@honeyplanet.jp>
parents:
diff
changeset
|
406 |
0ddbd0025174
added libaudtag. (not used yet.)
Yoshiki Yazawa <yaz@honeyplanet.jp>
parents:
diff
changeset
|
407 if (! ape_write_item (handle, key, value, & length)) |
0ddbd0025174
added libaudtag. (not used yet.)
Yoshiki Yazawa <yaz@honeyplanet.jp>
parents:
diff
changeset
|
408 goto ERROR; |
0ddbd0025174
added libaudtag. (not used yet.)
Yoshiki Yazawa <yaz@honeyplanet.jp>
parents:
diff
changeset
|
409 |
0ddbd0025174
added libaudtag. (not used yet.)
Yoshiki Yazawa <yaz@honeyplanet.jp>
parents:
diff
changeset
|
410 items ++; |
0ddbd0025174
added libaudtag. (not used yet.)
Yoshiki Yazawa <yaz@honeyplanet.jp>
parents:
diff
changeset
|
411 } |
0ddbd0025174
added libaudtag. (not used yet.)
Yoshiki Yazawa <yaz@honeyplanet.jp>
parents:
diff
changeset
|
412 |
0ddbd0025174
added libaudtag. (not used yet.)
Yoshiki Yazawa <yaz@honeyplanet.jp>
parents:
diff
changeset
|
413 DEBUG ("Wrote %d items, %d bytes.\n", items, length); |
0ddbd0025174
added libaudtag. (not used yet.)
Yoshiki Yazawa <yaz@honeyplanet.jp>
parents:
diff
changeset
|
414 |
0ddbd0025174
added libaudtag. (not used yet.)
Yoshiki Yazawa <yaz@honeyplanet.jp>
parents:
diff
changeset
|
415 if (write_header (length, items, FALSE, handle) || vfs_fseek (handle, start, |
0ddbd0025174
added libaudtag. (not used yet.)
Yoshiki Yazawa <yaz@honeyplanet.jp>
parents:
diff
changeset
|
416 SEEK_SET) || ! write_header (length, items, TRUE, handle)) |
0ddbd0025174
added libaudtag. (not used yet.)
Yoshiki Yazawa <yaz@honeyplanet.jp>
parents:
diff
changeset
|
417 goto ERROR; |
0ddbd0025174
added libaudtag. (not used yet.)
Yoshiki Yazawa <yaz@honeyplanet.jp>
parents:
diff
changeset
|
418 |
0ddbd0025174
added libaudtag. (not used yet.)
Yoshiki Yazawa <yaz@honeyplanet.jp>
parents:
diff
changeset
|
419 free_tag_list (list); |
0ddbd0025174
added libaudtag. (not used yet.)
Yoshiki Yazawa <yaz@honeyplanet.jp>
parents:
diff
changeset
|
420 return TRUE; |
0ddbd0025174
added libaudtag. (not used yet.)
Yoshiki Yazawa <yaz@honeyplanet.jp>
parents:
diff
changeset
|
421 |
0ddbd0025174
added libaudtag. (not used yet.)
Yoshiki Yazawa <yaz@honeyplanet.jp>
parents:
diff
changeset
|
422 ERROR: |
0ddbd0025174
added libaudtag. (not used yet.)
Yoshiki Yazawa <yaz@honeyplanet.jp>
parents:
diff
changeset
|
423 free_tag_list (list); |
0ddbd0025174
added libaudtag. (not used yet.)
Yoshiki Yazawa <yaz@honeyplanet.jp>
parents:
diff
changeset
|
424 return FALSE; |
0ddbd0025174
added libaudtag. (not used yet.)
Yoshiki Yazawa <yaz@honeyplanet.jp>
parents:
diff
changeset
|
425 } |
0ddbd0025174
added libaudtag. (not used yet.)
Yoshiki Yazawa <yaz@honeyplanet.jp>
parents:
diff
changeset
|
426 |
0ddbd0025174
added libaudtag. (not used yet.)
Yoshiki Yazawa <yaz@honeyplanet.jp>
parents:
diff
changeset
|
427 const tag_module_t ape = |
0ddbd0025174
added libaudtag. (not used yet.)
Yoshiki Yazawa <yaz@honeyplanet.jp>
parents:
diff
changeset
|
428 { |
0ddbd0025174
added libaudtag. (not used yet.)
Yoshiki Yazawa <yaz@honeyplanet.jp>
parents:
diff
changeset
|
429 .name = "APE", |
0ddbd0025174
added libaudtag. (not used yet.)
Yoshiki Yazawa <yaz@honeyplanet.jp>
parents:
diff
changeset
|
430 .can_handle_file = ape_is_our_file, |
0ddbd0025174
added libaudtag. (not used yet.)
Yoshiki Yazawa <yaz@honeyplanet.jp>
parents:
diff
changeset
|
431 .populate_tuple_from_file = ape_fill_tuple, |
0ddbd0025174
added libaudtag. (not used yet.)
Yoshiki Yazawa <yaz@honeyplanet.jp>
parents:
diff
changeset
|
432 .write_tuple_to_file = ape_write_tag, |
0ddbd0025174
added libaudtag. (not used yet.)
Yoshiki Yazawa <yaz@honeyplanet.jp>
parents:
diff
changeset
|
433 }; |