id3lib  3.8.3
field.cpp
Go to the documentation of this file.
1 // $Id: field.cpp,v 1.47 2002/11/03 00:41:27 t1mpy Exp $
2 
3 // id3lib: a C++ library for creating and manipulating id3v1/v2 tags
4 // Copyright 1999, 2000 Scott Thomas Haug
5 // Copyright 2002 Thijmen Klok (thijmen@id3lib.org)
6 
7 // This library is free software; you can redistribute it and/or modify it
8 // under the terms of the GNU Library General Public License as published by
9 // the Free Software Foundation; either version 2 of the License, or (at your
10 // option) any later version.
11 //
12 // This library is distributed in the hope that it will be useful, but WITHOUT
13 // ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
14 // FITNESS FOR A PARTICULAR PURPOSE. See the GNU Library General Public
15 // License for more details.
16 //
17 // You should have received a copy of the GNU Library General Public License
18 // along with this library; if not, write to the Free Software Foundation,
19 // Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
20 
21 // The id3lib authors encourage improvements and optimisations to be sent to
22 // the id3lib coordinator. Please see the README file for details on where to
23 // send such submissions. See the AUTHORS file for a list of people who have
24 // contributed to id3lib. See the ChangeLog file for a list of changes to
25 // id3lib. These files are distributed with id3lib at
26 // http://download.sourceforge.net/id3lib/
27 
28 
29 #include "field_impl.h"
30 #include "id3/utils.h" // has <config.h> "id3/id3lib_streams.h" "id3/globals.h" "id3/id3lib_strings.h"
31 #include "field_def.h"
32 #include "frame_def.h"
33 #include "readers.h"
34 #include <assert.h>
35 
36 using namespace dami;
37 
38 // This is used for unimplemented frames so that their data is preserved when
39 // parsing and rendering
40 static ID3_FieldDef ID3FD_Unimplemented[] =
41 {
42  {
43  ID3FN_DATA, // FIELD NAME
44  ID3FTY_BINARY, // FIELD TYPE
45  0, // FIXED LEN
46  ID3V2_EARLIEST, // INITIAL SPEC
47  ID3V2_LATEST, // ENDING SPEC
48  ID3FF_NONE, // FLAGS
49  ID3FN_NOFIELD // LINKED FIELD
50  },
51  { ID3FN_NOFIELD }
52 };
53 
54 const ID3_FieldDef* ID3_FieldDef::DEFAULT = ID3FD_Unimplemented;
55 
56 static ID3_FieldDef ID3FD_URL[] =
57 {
58  {
59  ID3FN_URL, // FIELD NAME
60  ID3FTY_TEXTSTRING, // FIELD TYPE
61  0, // FIXED LEN
62  ID3V2_EARLIEST, // INITIAL SPEC
63  ID3V2_LATEST, // ENDING SPEC
64  ID3FF_NONE, // FLAGS
65  ID3FN_NOFIELD // LINKED FIELD
66  },
67  { ID3FN_NOFIELD }
68 };
69 
70 static ID3_FieldDef ID3FD_UserURL[] =
71 {
72  {
73  ID3FN_TEXTENC, // FIELD NAME
74  ID3FTY_INTEGER, // FIELD TYPE
75  1, // FIXED LEN
76  ID3V2_EARLIEST, // INITIAL SPEC
77  ID3V2_LATEST, // ENDING SPEC
78  ID3FF_NONE, // FLAGS
79  ID3FN_NOFIELD // LINKED FIELD
80  },
81  {
82  ID3FN_DESCRIPTION, // FIELD NAME
83  ID3FTY_TEXTSTRING, // FIELD TYPE
84  0, // FIXED LEN
85  ID3V2_EARLIEST, // INITIAL SPEC
86  ID3V2_LATEST, // ENDING SPEC
87  ID3FF_CSTR | ID3FF_ENCODABLE, // FLAGS
88  ID3FN_NOFIELD // LINKED FIELD
89  },
90  {
91  ID3FN_URL, // FIELD NAME
92  ID3FTY_TEXTSTRING, // FIELD TYPE
93  0, // FIXED LEN
94  ID3V2_EARLIEST, // INITIAL SPEC
95  ID3V2_LATEST, // ENDING SPEC
96  ID3FF_NONE, // FLAGS
97  ID3FN_NOFIELD // LINKED FIELD
98  },
99  { ID3FN_NOFIELD }
100 };
101 
102 static ID3_FieldDef ID3FD_Text[] =
103 {
104  {
105  ID3FN_TEXTENC, // FIELD NAME
106  ID3FTY_INTEGER, // FIELD TYPE
107  1, // FIXED LEN
108  ID3V2_EARLIEST, // INITIAL SPEC
109  ID3V2_LATEST, // ENDING SPEC
110  ID3FF_NONE, // FLAGS
111  ID3FN_NOFIELD // LINKED FIELD
112  },
113  {
114  ID3FN_TEXT, // FIELD NAME
115  ID3FTY_TEXTSTRING, // FIELD TYPE
116  0, // FIXED LEN
117  ID3V2_EARLIEST, // INITIAL SPEC
118  ID3V2_LATEST, // ENDING SPEC
119  ID3FF_ENCODABLE, // FLAGS
120  ID3FN_NOFIELD // LINKED FIELD
121  },
122  { ID3FN_NOFIELD }
123 };
124 
125 
126 static ID3_FieldDef ID3FD_UserText[] =
127 {
128  {
129  ID3FN_TEXTENC, // FIELD NAME
130  ID3FTY_INTEGER, // FIELD TYPE
131  1, // FIXED LEN
132  ID3V2_EARLIEST, // INITIAL SPEC
133  ID3V2_LATEST, // ENDING SPEC
134  ID3FF_NONE, // FLAGS
135  ID3FN_NOFIELD // LINKED FIELD
136  },
137  {
138  ID3FN_DESCRIPTION, // FIELD NAME
139  ID3FTY_TEXTSTRING, // FIELD TYPE
140  0, // FIXED LEN
141  ID3V2_EARLIEST, // INITIAL SPEC
142  ID3V2_LATEST, // ENDING SPEC
143  ID3FF_CSTR | ID3FF_ENCODABLE, // FLAGS
144  ID3FN_NOFIELD // LINKED FIELD
145  },
146  {
147  ID3FN_TEXT, // FIELD NAME
148  ID3FTY_TEXTSTRING, // FIELD TYPE
149  0, // FIXED LEN
150  ID3V2_EARLIEST, // INITIAL SPEC
151  ID3V2_LATEST, // ENDING SPEC
152  ID3FF_ENCODABLE, // FLAGS
153  ID3FN_NOFIELD // LINKED FIELD
154  },
155  { ID3FN_NOFIELD }
156 };
157 
158 
159 static ID3_FieldDef ID3FD_GeneralText[] =
160 {
161  {
162  ID3FN_TEXTENC, // FIELD NAME
163  ID3FTY_INTEGER, // FIELD TYPE
164  1, // FIXED LEN
165  ID3V2_EARLIEST, // INITIAL SPEC
166  ID3V2_LATEST, // ENDING SPEC
167  ID3FF_NONE, // FLAGS
168  ID3FN_NOFIELD // LINKED FIELD
169  },
170  {
171  ID3FN_LANGUAGE, // FIELD NAME
172  ID3FTY_TEXTSTRING, // FIELD TYPE
173  3, // FIXED LEN
174  ID3V2_EARLIEST, // INITIAL SPEC
175  ID3V2_LATEST, // ENDING SPEC
176  ID3FF_NONE, // FLAGS
177  ID3FN_NOFIELD // LINKED FIELD
178  },
179  {
180  ID3FN_DESCRIPTION, // FIELD NAME
181  ID3FTY_TEXTSTRING, // FIELD TYPE
182  0, // FIXED LEN
183  ID3V2_EARLIEST, // INITIAL SPEC
184  ID3V2_LATEST, // ENDING SPEC
185  ID3FF_CSTR | ID3FF_ENCODABLE, // FLAGS
186  ID3FN_NOFIELD // LINKED FIELD
187  },
188  {
189  ID3FN_TEXT, // FIELD NAME
190  ID3FTY_TEXTSTRING, // FIELD TYPE
191  0, // FIXED LEN
192  ID3V2_EARLIEST, // INITIAL SPEC
193  ID3V2_LATEST, // ENDING SPEC
194  ID3FF_ENCODABLE, // FLAGS
195  ID3FN_NOFIELD // LINKED FIELD
196  },
197  { ID3FN_NOFIELD }
198 };
199 
200 static ID3_FieldDef ID3FD_TermsOfUse[] =
201 {
202  {
203  ID3FN_TEXTENC, // FIELD NAME
204  ID3FTY_INTEGER, // FIELD TYPE
205  1, // FIXED LEN
206  ID3V2_3_0, // INITIAL SPEC
207  ID3V2_LATEST, // ENDING SPEC
208  ID3FF_NONE, // FLAGS
209  ID3FN_NOFIELD // LINKED FIELD
210  },
211  {
212  ID3FN_LANGUAGE, // FIELD NAME
213  ID3FTY_TEXTSTRING, // FIELD TYPE
214  3, // FIXED LEN
215  ID3V2_3_0, // INITIAL SPEC
216  ID3V2_LATEST, // ENDING SPEC
217  ID3FF_NONE, // FLAGS
218  ID3FN_NOFIELD // LINKED FIELD
219  },
220  {
221  ID3FN_TEXT, // FIELD NAME
222  ID3FTY_TEXTSTRING, // FIELD TYPE
223  0, // FIXED LEN
224  ID3V2_3_0, // INITIAL SPEC
225  ID3V2_LATEST, // ENDING SPEC
226  ID3FF_ENCODABLE, // FLAGS
227  ID3FN_NOFIELD // LINKED FIELD
228  },
229  { ID3FN_NOFIELD }
230 };
231 
232 static ID3_FieldDef ID3FD_LinkedInfo[] =
233 {
234  {
235  ID3FN_ID, // FIELD NAME
236  ID3FTY_TEXTSTRING, // FIELD TYPE
237  3, // FIXED LEN
238  ID3V2_EARLIEST, // INITIAL SPEC
239  ID3V2_2_1, // ENDING SPEC
240  ID3FF_NONE, // FLAGS
241  ID3FN_NOFIELD // LINKED FIELD
242  },
243  {
244  ID3FN_ID, // FIELD NAME
245  ID3FTY_TEXTSTRING, // FIELD TYPE
246  4, // FIXED LEN
247  ID3V2_3_0, // INITIAL SPEC
248  ID3V2_LATEST, // ENDING SPEC
249  ID3FF_NONE, // FLAGS
250  ID3FN_NOFIELD // LINKED FIELD
251  },
252  {
253  ID3FN_URL, // FIELD NAME
254  ID3FTY_TEXTSTRING, // FIELD TYPE
255  0, // FIXED LEN
256  ID3V2_EARLIEST, // INITIAL SPEC
257  ID3V2_LATEST, // ENDING SPEC
258  ID3FF_CSTR, // FLAGS
259  ID3FN_NOFIELD // LINKED FIELD
260  },
261  {
262  ID3FN_TEXT, // FIELD NAME
263  ID3FTY_TEXTSTRING, // FIELD TYPE
264  0, // FIXED LEN
265  ID3V2_EARLIEST, // INITIAL SPEC
266  ID3V2_LATEST, // ENDING SPEC
267  ID3FF_NONE, // FLAGS
268  ID3FN_NOFIELD // LINKED FIELD
269  },
270  { ID3FN_NOFIELD }
271 };
272 
273 static ID3_FieldDef ID3FD_Picture[] =
274 {
275  {
276  ID3FN_TEXTENC, // FIELD NAME
277  ID3FTY_INTEGER, // FIELD TYPE
278  1, // FIXED LEN
279  ID3V2_EARLIEST, // INITIAL SPEC
280  ID3V2_LATEST, // ENDING SPEC
281  ID3FF_NONE, // FLAGS
282  ID3FN_NOFIELD // LINKED FIELD
283  },
284  {
285  ID3FN_IMAGEFORMAT, // FIELD NAME
286  ID3FTY_TEXTSTRING, // FIELD TYPE
287  3, // FIXED LEN
288  ID3V2_EARLIEST, // INITIAL SPEC
289  ID3V2_2_1, // ENDING SPEC
290  ID3FF_NONE, // FLAGS
291  ID3FN_NOFIELD // LINKED FIELD
292  },
293  {
294  ID3FN_MIMETYPE, // FIELD NAME
295  ID3FTY_TEXTSTRING, // FIELD TYPE
296  0, // FIXED LEN
297  ID3V2_3_0, // INITIAL SPEC
298  ID3V2_LATEST, // ENDING SPEC
299  ID3FF_CSTR, // FLAGS
300  ID3FN_NOFIELD // LINKED FIELD
301  },
302  {
303  ID3FN_PICTURETYPE, // FIELD NAME
304  ID3FTY_INTEGER, // FIELD TYPE
305  1, // FIXED LEN
306  ID3V2_EARLIEST, // INITIAL SPEC
307  ID3V2_LATEST, // ENDING SPEC
308  ID3FF_NONE, // FLAGS
309  ID3FN_NOFIELD // LINKED FIELD
310  },
311  {
312  ID3FN_DESCRIPTION, // FIELD NAME
313  ID3FTY_TEXTSTRING, // FIELD TYPE
314  0, // FIXED LEN
315  ID3V2_EARLIEST, // INITIAL SPEC
316  ID3V2_LATEST, // ENDING SPEC
317  ID3FF_CSTR | ID3FF_ENCODABLE, // FLAGS
318  ID3FN_NOFIELD // LINKED FIELD
319  },
320  {
321  ID3FN_DATA, // FIELD NAME
322  ID3FTY_BINARY, // FIELD TYPE
323  0, // FIXED LEN
324  ID3V2_EARLIEST, // INITIAL SPEC
325  ID3V2_LATEST, // ENDING SPEC
326  ID3FF_NONE, // FLAGS
327  ID3FN_NOFIELD // LINKED FIELD
328  },
329  { ID3FN_NOFIELD }
330 };
331 
332 static ID3_FieldDef ID3FD_GEO[] =
333 {
334  {
335  ID3FN_TEXTENC, // FIELD NAME
336  ID3FTY_INTEGER, // FIELD TYPE
337  1, // FIXED LEN
338  ID3V2_EARLIEST, // INITIAL SPEC
339  ID3V2_LATEST, // ENDING SPEC
340  ID3FF_NONE, // FLAGS
341  ID3FN_NOFIELD // LINKED FIELD
342  },
343  {
344  ID3FN_MIMETYPE, // FIELD NAME
345  ID3FTY_TEXTSTRING, // FIELD TYPE
346  0, // FIXED LEN
347  ID3V2_EARLIEST, // INITIAL SPEC
348  ID3V2_LATEST, // ENDING SPEC
349  ID3FF_CSTR, // FLAGS
350  ID3FN_NOFIELD // LINKED FIELD
351  },
352  {
353  ID3FN_FILENAME, // FIELD NAME
354  ID3FTY_TEXTSTRING, // FIELD TYPE
355  0, // FIXED LEN
356  ID3V2_EARLIEST, // INITIAL SPEC
357  ID3V2_LATEST, // ENDING SPEC
358  ID3FF_CSTR | ID3FF_ENCODABLE, // FLAGS
359  ID3FN_NOFIELD // LINKED FIELD
360  },
361  {
362  ID3FN_DESCRIPTION, // FIELD NAME
363  ID3FTY_TEXTSTRING, // FIELD TYPE
364  0, // FIXED LEN
365  ID3V2_EARLIEST, // INITIAL SPEC
366  ID3V2_LATEST, // ENDING SPEC
367  ID3FF_CSTR | ID3FF_ENCODABLE, // FLAGS
368  ID3FN_NOFIELD // LINKED FIELD
369  },
370  {
371  ID3FN_DATA, // FIELD NAME
372  ID3FTY_BINARY, // FIELD TYPE
373  0, // FIXED LEN
374  ID3V2_EARLIEST, // INITIAL SPEC
375  ID3V2_LATEST, // ENDING SPEC
376  ID3FF_NONE, // FLAGS
377  ID3FN_NOFIELD // LINKED FIELD
378  },
379  { ID3FN_NOFIELD }
380 };
381 
382 static ID3_FieldDef ID3FD_UFI[] =
383 {
384  {
385  ID3FN_OWNER, // FIELD NAME
386  ID3FTY_TEXTSTRING, // FIELD TYPE
387  0, // FIXED LEN
388  ID3V2_EARLIEST, // INITIAL SPEC
389  ID3V2_LATEST, // ENDING SPEC
390  ID3FF_CSTR, // FLAGS
391  ID3FN_NOFIELD // LINKED FIELD
392  },
393  {
394  ID3FN_DATA, // FIELD NAME
395  ID3FTY_BINARY, // FIELD TYPE
396  0, // FIXED LEN
397  ID3V2_EARLIEST, // INITIAL SPEC
398  ID3V2_LATEST, // ENDING SPEC
399  ID3FF_NONE, // FLAGS
400  ID3FN_NOFIELD // LINKED FIELD
401  },
402  { ID3FN_NOFIELD }
403 };
404 
405 static ID3_FieldDef ID3FD_PlayCounter[] =
406 {
407  {
408  ID3FN_COUNTER, // FIELD NAME
409  ID3FTY_INTEGER, // FIELD TYPE
410  4, // FIXED LEN
411  ID3V2_EARLIEST, // INITIAL SPEC
412  ID3V2_LATEST, // ENDING SPEC
413  ID3FF_NONE, // FLAGS
414  ID3FN_NOFIELD // LINKED FIELD
415  },
416  { ID3FN_NOFIELD }
417 };
418 
419 static ID3_FieldDef ID3FD_Popularimeter[] =
420 {
421  {
422  ID3FN_EMAIL, // FIELD NAME
423  ID3FTY_TEXTSTRING, // FIELD TYPE
424  0, // FIXED LEN
425  ID3V2_EARLIEST, // INITIAL SPEC
426  ID3V2_LATEST, // ENDING SPEC
427  ID3FF_CSTR, // FLAGS
428  ID3FN_NOFIELD // LINKED FIELD
429  },
430  {
431  ID3FN_RATING, // FIELD NAME
432  ID3FTY_INTEGER, // FIELD TYPE
433  1, // FIXED LEN
434  ID3V2_EARLIEST, // INITIAL SPEC
435  ID3V2_LATEST, // ENDING SPEC
436  ID3FF_NONE, // FLAGS
437  ID3FN_NOFIELD // LINKED FIELD
438  },
439  {
440  ID3FN_COUNTER, // FIELD NAME
441  ID3FTY_INTEGER, // FIELD TYPE
442  4, // FIXED LEN
443  ID3V2_EARLIEST, // INITIAL SPEC
444  ID3V2_LATEST, // ENDING SPEC
445  ID3FF_NONE, // FLAGS
446  ID3FN_NOFIELD // LINKED FIELD
447  },
448  { ID3FN_NOFIELD }
449 };
450 
451 static ID3_FieldDef ID3FD_Private[] =
452 {
453  {
454  ID3FN_OWNER, // FIELD NAME
455  ID3FTY_TEXTSTRING, // FIELD TYPE
456  0, // FIXED LEN
457  ID3V2_3_0, // INITIAL SPEC
458  ID3V2_LATEST, // ENDING SPEC
459  ID3FF_CSTR, // FLAGS
460  ID3FN_NOFIELD // LINKED FIELD
461  },
462  {
463  ID3FN_DATA, // FIELD NAME
464  ID3FTY_BINARY, // FIELD TYPE
465  0, // FIXED LEN
466  ID3V2_3_0, // INITIAL SPEC
467  ID3V2_LATEST, // ENDING SPEC
468  ID3FF_NONE, // FLAGS
469  ID3FN_NOFIELD // LINKED FIELD
470  },
471  { ID3FN_NOFIELD }
472 };
473 
474 
475 static ID3_FieldDef ID3FD_Registration[] =
476 {
477  {
478  ID3FN_OWNER, // FIELD NAME
479  ID3FTY_TEXTSTRING, // FIELD TYPE
480  0, // FIXED LEN
481  ID3V2_3_0, // INITIAL SPEC
482  ID3V2_LATEST, // ENDING SPEC
483  ID3FF_CSTR, // FLAGS
484  ID3FN_NOFIELD // LINKED FIELD
485  },
486  {
487  ID3FN_ID, // FIELD NAME
488  ID3FTY_INTEGER, // FIELD TYPE
489  1, // FIXED LEN
490  ID3V2_3_0, // INITIAL SPEC
491  ID3V2_LATEST, // ENDING SPEC
492  ID3FF_NONE, // FLAGS
493  ID3FN_NOFIELD // LINKED FIELD
494  },
495  {
496  ID3FN_DATA, // FIELD NAME
497  ID3FTY_BINARY, // FIELD TYPE
498  0, // FIXED LEN
499  ID3V2_3_0, // INITIAL SPEC
500  ID3V2_LATEST, // ENDING SPEC
501  ID3FF_NONE, // FLAGS
502  ID3FN_NOFIELD // LINKED FIELD
503  },
504  { ID3FN_NOFIELD }
505 };
506 
507 static ID3_FieldDef ID3FD_InvolvedPeople[] =
508 {
509  {
510  ID3FN_TEXTENC, // FIELD NAME
511  ID3FTY_INTEGER, // FIELD TYPE
512  1, // FIXED LEN
513  ID3V2_EARLIEST, // INITIAL SPEC
514  ID3V2_LATEST, // ENDING SPEC
515  ID3FF_NONE, // FLAGS
516  ID3FN_NOFIELD // LINKED FIELD
517  },
518  {
519  ID3FN_TEXT, // FIELD NAME
520  ID3FTY_TEXTSTRING, // FIELD TYPE
521  0, // FIXED LEN
522  ID3V2_EARLIEST, // INITIAL SPEC
523  ID3V2_LATEST, // ENDING SPEC
524  ID3FF_TEXTLIST, // FLAGS
525  ID3FN_NOFIELD // LINKED FIELD
526  },
527  { ID3FN_NOFIELD }
528 };
529 
530 static ID3_FieldDef ID3FD_CDM[] =
531 {
532  {
533  ID3FN_DATA, // FIELD NAME
534  ID3FTY_BINARY, // FIELD TYPE
535  0, // FIXED LEN
536  ID3V2_2_1, // INITIAL SPEC
537  ID3V2_2_1, // ENDING SPEC
538  ID3FF_NONE, // FLAGS
539  ID3FN_NOFIELD // LINKED FIELD
540  }
541 };
542 
543 static ID3_FieldDef ID3FD_SyncLyrics[] =
544 {
545  {
546  ID3FN_TEXTENC, // FIELD NAME
547  ID3FTY_INTEGER, // FIELD TYPE
548  1, // FIXED LEN
549  ID3V2_EARLIEST, // INITIAL SPEC
550  ID3V2_LATEST, // ENDING SPEC
551  ID3FF_NONE, // FLAGS
552  ID3FN_NOFIELD // LINKED FIELD
553  },
554  {
555  ID3FN_LANGUAGE, // FIELD NAME
556  ID3FTY_TEXTSTRING, // FIELD TYPE
557  3, // FIXED LEN
558  ID3V2_EARLIEST, // INITIAL SPEC
559  ID3V2_LATEST, // ENDING SPEC
560  ID3FF_NONE, // FLAGS
561  ID3FN_NOFIELD // LINKED FIELD
562  },
563  {
564  ID3FN_TIMESTAMPFORMAT, // FIELD NAME
565  ID3FTY_INTEGER, // FIELD TYPE
566  1, // FIXED LEN
567  ID3V2_EARLIEST, // INITIAL SPEC
568  ID3V2_LATEST, // ENDING SPEC
569  ID3FF_NONE, // FLAGS
570  ID3FN_NOFIELD // LINKED FIELD
571  },
572  {
573  ID3FN_CONTENTTYPE, // FIELD NAME
574  ID3FTY_INTEGER, // FIELD TYPE
575  1, // FIXED LEN
576  ID3V2_EARLIEST, // INITIAL SPEC
577  ID3V2_LATEST, // ENDING SPEC
578  ID3FF_NONE, // FLAGS
579  ID3FN_NOFIELD // LINKED FIELD
580  },
581  {
582  ID3FN_DESCRIPTION, // FIELD NAME
583  ID3FTY_TEXTSTRING, // FIELD TYPE
584  0, // FIXED LEN
585  ID3V2_EARLIEST, // INITIAL SPEC
586  ID3V2_LATEST, // ENDING SPEC
587  ID3FF_CSTR | ID3FF_ENCODABLE, // FLAGS
588  ID3FN_NOFIELD // LINKED FIELD
589  },
590  {
591  ID3FN_DATA, // FIELD NAME
592  ID3FTY_BINARY, // FIELD TYPE
593  0, // FIXED LEN
594  ID3V2_EARLIEST, // INITIAL SPEC
595  ID3V2_LATEST, // ENDING SPEC
596  ID3FF_NONE, // FLAGS
597  ID3FN_NOFIELD // LINKED FIELD
598  },
599  { ID3FN_NOFIELD }
600 };
601 
602 
603 /*
604  * Currently unused
605  */
606 #if defined _UNDEFINED_
607 static ID3_FieldDef ID3FD_Volume[] =
608 {
609  {
610  ID3FN_VOLUMEADJ, // FIELD NAME
611  ID3FTY_INTEGER, // FIELD TYPE
612  1, // FIXED LEN
613  ID3V2_EARLIEST, // INITIAL SPEC
614  ID3V2_LATEST, // ENDING SPEC
615  ID3FF_NONE, // FLAGS
616  ID3FN_NOFIELD // LINKED FIELD
617  },
618  {
619  ID3FN_NUMBITS, // FIELD NAME
620  ID3FTY_INTEGER, // FIELD TYPE
621  1, // FIXED LEN
622  ID3V2_EARLIEST, // INITIAL SPEC
623  ID3V2_LATEST, // ENDING SPEC
624  ID3FF_NONE, // FLAGS
625  ID3FN_NOFIELD // LINKED FIELD
626  },
627  {
628  ID3FN_VOLCHGRIGHT, // FIELD NAME
629  ID3FTY_BITFIELD, // FIELD TYPE
630  0, // FIXED LEN
631  ID3V2_EARLIEST, // INITIAL SPEC
632  ID3V2_LATEST, // ENDING SPEC
633  ID3FF_ADJUSTEDBY, // FLAGS
634  ID3FN_NUMBITS // LINKED FIELD
635  },
636  {
637  ID3FN_VOLCHGLEFT, // FIELD NAME
638  ID3FTY_BITFIELD, // FIELD TYPE
639  0, // FIXED LEN
640  ID3V2_EARLIEST, // INITIAL SPEC
641  ID3V2_LATEST, // ENDING SPEC
642  ID3FF_ADJUSTEDBY, // FLAGS
643  ID3FN_NUMBITS // LINKED FIELD
644  },
645  {
646  ID3FN_PEAKVOLRIGHT, // FIELD NAME
647  ID3FTY_BITFIELD, // FIELD TYPE
648  0, // FIXED LEN
649  ID3V2_EARLIEST, // INITIAL SPEC
650  ID3V2_LATEST, // ENDING SPEC
651  ID3FF_ADJUSTEDBY, // FLAGS
652  ID3FN_NUMBITS // LINKED FIELD
653  },
654  {
655  ID3FN_PEAKVOLLEFT, // FIELD NAME
656  ID3FTY_BITFIELD, // FIELD TYPE
657  0, // FIXED LEN
658  ID3V2_EARLIEST, // INITIAL SPEC
659  ID3V2_LATEST, // ENDING SPEC
660  ID3FF_ADJUSTEDBY, // FLAGS
661  ID3FN_NUMBITS // LINKED FIELD
662  },
663  { ID3FN_NOFIELD }
664 };
665 #endif /* _UNDEFINED_ */
666 
667 // **** Currently Implemented Frames
668 // APIC PIC ID3FID_PICTURE Attached picture
669 // COMM COM ID3FID_COMMENT Comments
670 // ENCR ID3FID_CRYPTOREG Encryption method registration
671 // GEOB GEO ID3FID_GENERALOBJECT General encapsulated object
672 // GRID ID3FID_GROUPINGREG Group identification registration
673 // IPLS IPL ID3FID_INVOLVEDPEOPLE Involved people list
674 // LINK LNK ID3FID_LINKEDINFO Linked information
675 // PCNT CNT ID3FID_PLAYCOUNTER Play counter
676 // POPM POP ID3FID_POPULARIMETER Popularimeter
677 // PRIV ID3FID_PRIVATE Private frame
678 // SYLT SLT ID3FID_SYNCEDLYRICS Synchronized lyric/text
679 // TALB TAL ID3FID_ALBUM Album/Movie/Show title
680 // TBPM TBP ID3FID_BPM BPM (beats per minute)
681 // TCOM TCM ID3FID_COMPOSER Composer
682 // TCON TCO ID3FID_CONTENTTYPE Content type
683 // TCOP TCR ID3FID_COPYRIGHT Copyright message
684 // TDAT TDA ID3FID_DATE Date
685 // TDLY TDY ID3FID_PLAYLISTDELAY Playlist delay
686 // TENC TEN ID3FID_ENCODEDBY Encoded by
687 // TEXT TXT ID3FID_LYRICIST Lyricist/Text writer
688 // TFLT TFT ID3FID_FILETYPE File type
689 // TIME TKE ID3FID_TIME Time
690 // TIT1 TIM ID3FID_CONTENTGROUP Content group description
691 // TIT2 TT1 ID3FID_TITLE Title/songname/content description
692 // TIT3 TT2 ID3FID_SUBTITLE Subtitle/Description refinement
693 // TKEY TT3 ID3FID_INITIALKEY Initial key
694 // TLAN TLA ID3FID_LANGUAGE Language(s)
695 // TLEN TLE ID3FID_SONGLEN Length
696 // TMED TMT ID3FID_MEDIATYPE Media type
697 // TOAL TOT ID3FID_ORIGALBUM Original album/movie/show title
698 // TOFN TOF ID3FID_ORIGFILENAME Original filename
699 // TOLY TOL ID3FID_ORIGLYRICIST Original lyricist(s)/text writer(s)
700 // TOPE TOA ID3FID_ORIGARTIST Original artist(s)/performer(s)
701 // TORY TOR ID3FID_ORIGYEAR Original release year
702 // TOWN ID3FID_FILEOWNER File owner/licensee
703 // TPE1 TP1 ID3FID_LEADARTIST Lead performer(s)/Soloist(s)
704 // TPE2 TP2 ID3FID_BAND Band/orchestra/accompaniment
705 // TPE3 TP3 ID3FID_CONDUCTOR Conductor/performer refinement
706 // TPE4 TP4 ID3FID_MIXARTIST Interpreted, remixed, or otherwise modified
707 // TPOS TPA ID3FID_PARTINSET Part of a set
708 // TPUB TPB ID3FID_PUBLISHER Publisher
709 // TRCK TRK ID3FID_TRACKNUM Track number/Position in set
710 // TRDA TRD ID3FID_RECORDINGDATES Recording dates
711 // TRSN TRN ID3FID_NETRADIOSTATION Internet radio station name
712 // TRSO TRO ID3FID_NETRADIOOWNER Internet radio station owner
713 // TSIZ TSI ID3FID_SIZE Size
714 // TSRC TRC ID3FID_ISRC ISRC (international standard recording code)
715 // TSSE TSS ID3FID_ENCODERSETTINGS Software/Hardware and encoding settings
716 // TXXX TXX ID3FID_USERTEXT User defined text information
717 // TYER TYE ID3FID_YEAR Year
718 // UFID UFI ID3FID_UNIQUEFILEID Unique file identifier
719 // USER ID3FID_TERMSOFUSE Terms of use
720 // USLT ULT ID3FID_UNSYNCEDLYRICS Unsynchronized lyric/text transcription
721 // WCOM WCM ID3FID_WWWCOMMERCIALINFO Commercial information
722 // WCOP WCM ID3FID_WWWCOPYRIGHT Copyright/Legal infromation
723 // WOAF WCP ID3FID_WWWAUDIOFILE Official audio file webpage
724 // WOAR WAF ID3FID_WWWARTIST Official artist/performer webpage
725 // WOAS WAR ID3FID_WWWAUDIOSOURCE Official audio source webpage
726 // WORS WAS ID3FID_WWWRADIOPAGE Official internet radio station homepage
727 // WPAY WRA ID3FID_WWWPAYMENT Payment
728 // WPUB WPY ID3FID_WWWPUBLISHER Official publisher webpage
729 // WXXX WXX ID3FID_WWWUSER User defined URL link
730 // CDM ID3FID_METACOMPRESSION Compressed data meta frame
731 
732 // **** Currently unimplemented frames
733 // AENC CRA ID3FID_AUDIOCRYPTO Audio encryption
734 // COMR ID3FID_COMMERCIAL Commercial frame
735 // EQUA EQU ID3FID_EQUALIZATION Equalization
736 // ETCO ETC ID3FID_EVENTTIMING Event timing codes
737 // MCDI MCI ID3FID_CDID Music CD identifier
738 // MLLT MLL ID3FID_MPEGLOOKUP MPEG location lookup table
739 // OWNE ID3FID_OWNERSHIP Ownership frame
740 // POSS ID3FID_POSITIONSYNC Position synchronisation frame
741 // RBUF BUF ID3FID_BUFFERSIZE Recommended buffer size
742 // RVAD RVA ID3FID_VOLUMEADJ Relative volume adjustment
743 // RVRB REV ID3FID_REVERB Reverb
744 // SYTC STC ID3FID_SYNCEDTEMPO Synchronized tempo codes
745 // CRM ID3FID_METACRYPTO Encrypted meta frame
746 static ID3_FrameDef ID3_FrameDefs[] =
747 {
748  // short long tag file
749  // frame id id id discrd discrd field defs description
750  {ID3FID_AUDIOCRYPTO, "CRA", "AENC", false, false, ID3FD_Unimplemented, "Audio encryption"},
751  {ID3FID_PICTURE, "PIC", "APIC", false, false, ID3FD_Picture, "Attached picture"},
752  {ID3FID_COMMENT, "COM", "COMM", false, false, ID3FD_GeneralText, "Comments"},
753  {ID3FID_COMMERCIAL, "" , "COMR", false, false, ID3FD_Unimplemented, "Commercial"},
754  {ID3FID_CRYPTOREG, "" , "ENCR", false, false, ID3FD_Registration, "Encryption method registration"},
755  {ID3FID_EQUALIZATION, "EQU", "EQUA", false, true, ID3FD_Unimplemented, "Equalization"},
756  {ID3FID_EVENTTIMING, "ETC", "ETCO", false, true, ID3FD_Unimplemented, "Event timing codes"},
757  {ID3FID_GENERALOBJECT, "GEO", "GEOB", false, false, ID3FD_GEO, "General encapsulated object"},
758  {ID3FID_GROUPINGREG, "" , "GRID", false, false, ID3FD_Registration, "Group identification registration"},
759  {ID3FID_INVOLVEDPEOPLE, "IPL", "IPLS", false, false, ID3FD_InvolvedPeople,"Involved people list"},
760  {ID3FID_LINKEDINFO, "LNK", "LINK", false, false, ID3FD_LinkedInfo, "Linked information"},
761  {ID3FID_CDID, "MCI", "MCDI", false, false, ID3FD_Unimplemented, "Music CD identifier"},
762  {ID3FID_MPEGLOOKUP, "MLL", "MLLT", false, true, ID3FD_Unimplemented, "MPEG location lookup table"},
763  {ID3FID_OWNERSHIP, "" , "OWNE", false, false, ID3FD_Unimplemented, "Ownership frame"},
764  {ID3FID_PRIVATE, "" , "PRIV", false, false, ID3FD_Private, "Private frame"},
765  {ID3FID_PLAYCOUNTER, "CNT", "PCNT", false, false, ID3FD_PlayCounter, "Play counter"},
766  {ID3FID_POPULARIMETER, "POP", "POPM", false, false, ID3FD_Popularimeter, "Popularimeter"},
767  {ID3FID_POSITIONSYNC, "" , "POSS", false, true, ID3FD_Unimplemented, "Position synchronisation frame"},
768  {ID3FID_BUFFERSIZE, "BUF", "RBUF", false, false, ID3FD_Unimplemented, "Recommended buffer size"},
769  {ID3FID_VOLUMEADJ, "RVA", "RVAD", false, true, ID3FD_Unimplemented, "Relative volume adjustment"},
770  {ID3FID_REVERB, "REV", "RVRB", false, false, ID3FD_Unimplemented, "Reverb"},
771  {ID3FID_SYNCEDLYRICS, "SLT", "SYLT", false, false, ID3FD_SyncLyrics, "Synchronized lyric/text"},
772  {ID3FID_SYNCEDTEMPO, "STC", "SYTC", false, true, ID3FD_Unimplemented, "Synchronized tempo codes"},
773  {ID3FID_ALBUM, "TAL", "TALB", false, false, ID3FD_Text, "Album/Movie/Show title"},
774  {ID3FID_BPM, "TBP", "TBPM", false, false, ID3FD_Text, "BPM (beats per minute)"},
775  {ID3FID_COMPOSER, "TCM", "TCOM", false, false, ID3FD_Text, "Composer"},
776  {ID3FID_CONTENTTYPE, "TCO", "TCON", false, false, ID3FD_Text, "Content type"},
777  {ID3FID_COPYRIGHT, "TCR", "TCOP", false, false, ID3FD_Text, "Copyright message"},
778  {ID3FID_DATE, "TDA", "TDAT", false, false, ID3FD_Text, "Date"},
779  {ID3FID_PLAYLISTDELAY, "TDY", "TDLY", false, false, ID3FD_Text, "Playlist delay"},
780  {ID3FID_ENCODEDBY, "TEN", "TENC", false, true, ID3FD_Text, "Encoded by"},
781  {ID3FID_LYRICIST, "TXT", "TEXT", false, false, ID3FD_Text, "Lyricist/Text writer"},
782  {ID3FID_FILETYPE, "TFT", "TFLT", false, false, ID3FD_Text, "File type"},
783  {ID3FID_TIME, "TIM", "TIME", false, false, ID3FD_Text, "Time"},
784  {ID3FID_CONTENTGROUP, "TT1", "TIT1", false, false, ID3FD_Text, "Content group description"},
785  {ID3FID_TITLE, "TT2", "TIT2", false, false, ID3FD_Text, "Title/songname/content description"},
786  {ID3FID_SUBTITLE, "TT3", "TIT3", false, false, ID3FD_Text, "Subtitle/Description refinement"},
787  {ID3FID_INITIALKEY, "TKE", "TKEY", false, false, ID3FD_Text, "Initial key"},
788  {ID3FID_LANGUAGE, "TLA", "TLAN", false, false, ID3FD_Text, "Language(s)"},
789  {ID3FID_SONGLEN, "TLE", "TLEN", false, true, ID3FD_Text, "Length"},
790  {ID3FID_MEDIATYPE, "TMT", "TMED", false, false, ID3FD_Text, "Media type"},
791  {ID3FID_ORIGALBUM, "TOT", "TOAL", false, false, ID3FD_Text, "Original album/movie/show title"},
792  {ID3FID_ORIGFILENAME, "TOF", "TOFN", false, false, ID3FD_Text, "Original filename"},
793  {ID3FID_ORIGLYRICIST, "TOL", "TOLY", false, false, ID3FD_Text, "Original lyricist(s)/text writer(s)"},
794  {ID3FID_ORIGARTIST, "TOA", "TOPE", false, false, ID3FD_Text, "Original artist(s)/performer(s)"},
795  {ID3FID_ORIGYEAR, "TOR", "TORY", false, false, ID3FD_Text, "Original release year"},
796  {ID3FID_FILEOWNER, "" , "TOWN", false, false, ID3FD_Text, "File owner/licensee"},
797  {ID3FID_LEADARTIST, "TP1", "TPE1", false, false, ID3FD_Text, "Lead performer(s)/Soloist(s)"},
798  {ID3FID_BAND, "TP2", "TPE2", false, false, ID3FD_Text, "Band/orchestra/accompaniment"},
799  {ID3FID_CONDUCTOR, "TP3", "TPE3", false, false, ID3FD_Text, "Conductor/performer refinement"},
800  {ID3FID_MIXARTIST, "TP4", "TPE4", false, false, ID3FD_Text, "Interpreted, remixed, or otherwise modified by"},
801  {ID3FID_PARTINSET, "TPA", "TPOS", false, false, ID3FD_Text, "Part of a set"},
802  {ID3FID_PUBLISHER, "TPB", "TPUB", false, false, ID3FD_Text, "Publisher"},
803  {ID3FID_TRACKNUM, "TRK", "TRCK", false, false, ID3FD_Text, "Track number/Position in set"},
804  {ID3FID_RECORDINGDATES, "TRD", "TRDA", false, false, ID3FD_Text, "Recording dates"},
805  {ID3FID_NETRADIOSTATION, "TRN", "TRSN", false, false, ID3FD_Text, "Internet radio station name"},
806  {ID3FID_NETRADIOOWNER, "TRO", "TRSO", false, false, ID3FD_Text, "Internet radio station owner"},
807  {ID3FID_SIZE, "TSI", "TSIZ", false, true, ID3FD_Text, "Size"},
808  {ID3FID_ISRC, "TRC", "TSRC", false, false, ID3FD_Text, "ISRC (international standard recording code)"},
809  {ID3FID_ENCODERSETTINGS, "TSS", "TSSE", false, false, ID3FD_Text, "Software/Hardware and settings used for encoding"},
810  {ID3FID_USERTEXT, "TXX", "TXXX", false, false, ID3FD_UserText, "User defined text information"},
811  {ID3FID_YEAR, "TYE", "TYER", false, false, ID3FD_Text, "Year"},
812  {ID3FID_UNIQUEFILEID, "UFI", "UFID", false, false, ID3FD_UFI, "Unique file identifier"},
813  {ID3FID_TERMSOFUSE, "" , "USER", false, false, ID3FD_TermsOfUse, "Terms of use"},
814  {ID3FID_UNSYNCEDLYRICS, "ULT", "USLT", false, false, ID3FD_GeneralText, "Unsynchronized lyric/text transcription"},
815  {ID3FID_WWWCOMMERCIALINFO, "WCM", "WCOM", false, false, ID3FD_URL, "Commercial information"},
816  {ID3FID_WWWCOPYRIGHT, "WCP", "WCOP", false, false, ID3FD_URL, "Copyright/Legal infromation"},
817  {ID3FID_WWWAUDIOFILE, "WAF", "WOAF", false, false, ID3FD_URL, "Official audio file webpage"},
818  {ID3FID_WWWARTIST, "WAR", "WOAR", false, false, ID3FD_URL, "Official artist/performer webpage"},
819  {ID3FID_WWWAUDIOSOURCE, "WAS", "WOAS", false, false, ID3FD_URL, "Official audio source webpage"},
820  {ID3FID_WWWRADIOPAGE, "WRA", "WORS", false, false, ID3FD_URL, "Official internet radio station homepage"},
821  {ID3FID_WWWPAYMENT, "WPY", "WPAY", false, false, ID3FD_URL, "Payment"},
822  {ID3FID_WWWPUBLISHER, "WPB", "WPUB", false, false, ID3FD_URL, "Official publisher webpage"},
823  {ID3FID_WWWUSER, "WXX", "WXXX", false, false, ID3FD_UserURL, "User defined URL link"},
824  {ID3FID_METACRYPTO, "CRM", "" , false, false, ID3FD_Unimplemented, "Encrypted meta frame"},
825  {ID3FID_METACOMPRESSION, "CDM", "" , false, false, ID3FD_CDM, "Compressed data meta frame"},
827 };
828 
886 ID3_FieldImpl::ID3_FieldImpl()
887  : _id(ID3FN_NOFIELD),
888  _type(ID3FTY_INTEGER),
889  _spec_begin(ID3V2_EARLIEST),
890  _spec_end(ID3V2_LATEST),
891  _flags(0),
892  _changed(false),
893  _fixed_size(0),
894  _num_items(0),
895  _enc(ID3TE_NONE)
896 {
897  this->Clear();
898 }
899 
900 ID3_FieldImpl::ID3_FieldImpl(const ID3_FieldDef& def)
901  : _id(def._id),
902  _type(def._type),
903  _spec_begin(def._spec_begin),
904  _spec_end(def._spec_end),
905  _flags(def._flags),
906  _changed(false),
907  _fixed_size(def._fixed_size),
908  _num_items(0),
909  _enc((_type == ID3FTY_TEXTSTRING) ? ID3TE_ASCII : ID3TE_NONE)
910 {
911  this->Clear();
912 }
913 
915 {
916 }
917 
924 {
925  switch (_type)
926  {
927  case ID3FTY_INTEGER:
928  {
929  _integer = 0;
930  break;
931  }
932  case ID3FTY_BINARY:
933  {
934  _binary.erase();
935  if (_fixed_size > 0)
936  {
937  _binary.assign(_fixed_size, '\0');
938  }
939  break;
940  }
941  case ID3FTY_TEXTSTRING:
942  {
943  _text.erase();
944  if (_fixed_size > 0)
945  {
946  if (this->GetEncoding() == ID3TE_UNICODE)
947  {
948  _text.assign(_fixed_size * 2, '\0');
949  }
950  else if (this->GetEncoding() == ID3TE_ASCII)
951  {
952  _text.assign(_fixed_size, '\0');
953  }
954  }
955  break;
956  }
957  default:
958  {
959  break;
960  }
961  }
962  _changed = true;
963 
964  return ;
965 }
966 
967 bool
969 {
970  return _changed;
971 }
972 
993 {
994  if (_fixed_size > 0)
995  {
996  return _fixed_size;
997  }
998  size_t size = this->Size();
999  if (_type == ID3FTY_TEXTSTRING)
1000  {
1001  ID3_TextEnc enc = this->GetEncoding();
1002  if (enc == ID3TE_UNICODE && size > 0)
1003  {
1004  size++;
1005  }
1006  if (_flags & ID3FF_CSTR)
1007  {
1008  size++;
1009  }
1010  if (enc == ID3TE_UNICODE)
1011  {
1012  size *= 2;
1013  }
1014  }
1015  return size;
1016 }
1017 
1018 size_t ID3_FieldImpl::Size() const
1019 {
1020  size_t size = 0;
1021  // check to see if we are within the legal limit for this field 0 means
1022  // arbitrary length field
1023  if (_fixed_size > 0)
1024  {
1025  size = _fixed_size;
1026  }
1027  else if (_type == ID3FTY_INTEGER)
1028  {
1029  size = sizeof(uint32);
1030  }
1031  else if (_type == ID3FTY_TEXTSTRING)
1032  {
1033  size = _text.size();
1034  }
1035  else
1036  {
1037  size = _binary.size();
1038  }
1039 
1040  return size;
1041 }
1042 
1044 {
1045  bool success = false;
1046  switch (this->GetType())
1047  {
1048  case ID3FTY_INTEGER:
1049  {
1050  success = this->ParseInteger(reader);
1051  break;
1052  }
1053 
1054  case ID3FTY_BINARY:
1055  {
1056  success = this->ParseBinary(reader);
1057  break;
1058  }
1059 
1060  case ID3FTY_TEXTSTRING:
1061  {
1062  success = this->ParseText(reader);
1063  break;
1064  }
1065 
1066  default:
1067  {
1068  ID3D_WARNING( "ID3_FieldImpl::Parse(): unknown field type" );
1069  break;
1070  }
1071  }
1072  return success;
1073 }
1074 
1076 {
1077  ID3_FrameDef *info = NULL;
1078 
1079  for (size_t cur = 0; ID3_FrameDefs[cur].eID != ID3FID_NOFRAME; ++cur)
1080  {
1081  if (ID3_FrameDefs[cur].eID == id)
1082  {
1083  info = &ID3_FrameDefs[cur];
1084  break;
1085  }
1086  }
1087 
1088  return info;
1089 }
1090 
1092 ID3_FindFrameID(const char *id)
1093 {
1095  const int slen = strlen(id);
1096 
1097  for (size_t cur = 0; ID3_FrameDefs[cur].eID != ID3FID_NOFRAME; ++cur)
1098  {
1099  if (((strcmp(ID3_FrameDefs[cur].sShortTextID, id) == 0) &&
1100  slen == 3) ||
1101  ((strcmp(ID3_FrameDefs[cur].sLongTextID, id) == 0) &&
1102  slen == 4))
1103  {
1104  fid = ID3_FrameDefs[cur].eID;
1105  break;
1106  }
1107  }
1108 
1109  return fid;
1110 }
1111 
1113 {
1114  switch (this->GetType())
1115  {
1116  case ID3FTY_INTEGER:
1117  {
1118  RenderInteger(writer);
1119  break;
1120  }
1121 
1122  case ID3FTY_BINARY:
1123  {
1124  RenderBinary(writer);
1125  break;
1126  }
1127 
1128  case ID3FTY_TEXTSTRING:
1129  {
1130  RenderText(writer);
1131  break;
1132  }
1133 
1134  default:
1135  {
1136  ID3D_WARNING ( "ID3D_FieldImpl::Render(): unknown field type" );
1137  break;
1138  }
1139  }
1140 }
1141 
1142 ID3_Field &
1144 {
1145  const ID3_FieldImpl* fld = (const ID3_FieldImpl*) &rhs;
1146  if (this != &rhs && this->GetType() == fld->GetType())
1147  {
1148  switch (fld->GetType())
1149  {
1150  case ID3FTY_INTEGER:
1151  {
1152  this->SetInteger(fld->GetInteger());
1153  break;
1154  }
1155  case ID3FTY_TEXTSTRING:
1156  {
1157  this->SetEncoding(fld->GetEncoding());
1158  this->SetText(fld->GetText());
1159  break;
1160  }
1161  case ID3FTY_BINARY:
1162  {
1163  this->SetBinary(fld->GetBinary());
1164  break;
1165  }
1166  default:
1167  {
1168  break;
1169  }
1170  }
1171  }
1172  return *this;
1173 }
1174 
1176 {
1177  bool changed = this->IsEncodable() && (enc != this->GetEncoding()) &&
1178  (ID3TE_NONE < enc && enc < ID3TE_NUMENCODINGS);
1179  if (changed)
1180  {
1181  _text = convert(_text, _enc, enc);
1182  _enc = enc;
1183  _changed = true;
1184  }
1185  return changed;
1186 }
1187 
1243 {
1244  ID3_FrameDef *pFD = ID3_FindFrameDef(frameID);
1245  if (pFD!=NULL)
1246  return pFD->sShortTextID;
1247  else
1248  return NULL;
1249 }
1250 
1252 {
1253  ID3_FrameDef *pFD = ID3_FindFrameDef(frameID);
1254  if (pFD!=NULL)
1255  return pFD->sLongTextID;
1256  else
1257  return NULL;
1258 }
1259 
1261 {
1262  ID3_FrameDef *pFD = ID3_FindFrameDef(frameID);
1263  if (pFD!=NULL)
1264  return pFD->sDescription;
1265  else
1266  return NULL;
1267 }
1268 
1270 {
1271  return ID3FID_LASTFRAMEID-1;
1272 }
1273 
1275 {
1276  int fieldnum=0;
1277  ID3_FrameDef *pFD = ID3_FindFrameDef(frameID);
1278  if (pFD!=NULL)
1279  {
1280  while (pFD->aeFieldDefs[fieldnum]._id != ID3FN_NOFIELD)
1281  {
1282  ++fieldnum;
1283  }
1284  }
1285  return fieldnum;
1286 }
1287 
1289 {
1290  ID3_FrameDef *pFD = ID3_FindFrameDef(frameID);
1291  if (pFD!=NULL)
1292  return (pFD->aeFieldDefs[fieldnum]._type);
1293  else
1294  return ID3FTY_NONE;
1295 }
1296 
1297 size_t ID3_FrameInfo::FieldSize(ID3_FrameID frameID, int fieldnum)
1298 {
1299  ID3_FrameDef *pFD = ID3_FindFrameDef(frameID);
1300  if (pFD!=NULL)
1301  return (pFD->aeFieldDefs[fieldnum]._fixed_size);
1302  else
1303  return 0;
1304 }
1305 
1307 {
1308  ID3_FrameDef *pFD = ID3_FindFrameDef(frameID);
1309  if (pFD!=NULL)
1310  return (pFD->aeFieldDefs[fieldnum]._flags);
1311  else
1312  return 0;
1313 }
1314 
The representative class of an ID3v2 field.
Definition: field.h:37
dami::String GetText() const
bool HasChanged() const
Definition: field.cpp:968
bool ParseInteger(ID3_Reader &)
bool IsEncodable() const
Definition: field_impl.h:106
size_t SetText(dami::String)
void RenderInteger(ID3_Writer &) const
void RenderText(ID3_Writer &) const
uint32 GetInteger() const
void SetInteger(uint32)
ID3_Field & operator=(uint32 val)
A shortcut for the Set method.
Definition: field_impl.h:53
ID3_FieldType GetType() const
Definition: field_impl.h:103
bool ParseBinary(ID3_Reader &)
void Clear()
Clears any data and frees any memory associated with the field.
Definition: field.cpp:923
ID3_TextEnc GetEncoding() const
Definition: field_impl.h:105
void Render(ID3_Writer &) const
Definition: field.cpp:1112
~ID3_FieldImpl()
Definition: field.cpp:914
bool ParseText(ID3_Reader &)
bool Parse(ID3_Reader &)
Definition: field.cpp:1043
size_t Size() const
Returns the size of a field.
Definition: field.cpp:1018
void RenderBinary(ID3_Writer &) const
bool SetEncoding(ID3_TextEnc enc)
Definition: field.cpp:1175
size_t SetBinary(dami::BString)
Copies the supplied unicode string to the field.
dami::BString GetBinary() const
size_t BinSize() const
Definition: field.cpp:992
size_t FieldSize(ID3_FrameID frameid, int fieldnum)
Definition: field.cpp:1297
int NumFields(ID3_FrameID frameid)
Definition: field.cpp:1274
char * LongName(ID3_FrameID frameid)
Definition: field.cpp:1251
const char * Description(ID3_FrameID frameid)
Definition: field.cpp:1260
char * ShortName(ID3_FrameID frameid)
Definition: field.cpp:1242
ID3_FieldType FieldType(ID3_FrameID frameid, int fieldnum)
Definition: field.cpp:1288
int MaxFrameID()
Definition: field.cpp:1269
flags_t FieldFlags(ID3_FrameID frameid, int fieldnum)
Definition: field.cpp:1306
ID3_FrameDef * ID3_FindFrameDef(ID3_FrameID id)
Definition: field.cpp:1075
ID3_FrameID ID3_FindFrameID(const char *id)
Definition: field.cpp:1092
#define NULL
Definition: globals.h:743
@ ID3FN_MIMETYPE
Mimetype field.
Definition: globals.h:212
@ ID3FN_NOFIELD
No field.
Definition: globals.h:199
@ ID3FN_VOLCHGRIGHT
Volume chage on the right channel.
Definition: globals.h:217
@ ID3FN_PEAKVOLRIGHT
Peak volume on the right channel.
Definition: globals.h:219
@ ID3FN_EMAIL
Email field.
Definition: globals.h:206
@ ID3FN_VOLCHGLEFT
Volume chage on the left channel.
Definition: globals.h:218
@ ID3FN_DESCRIPTION
Description field.
Definition: globals.h:204
@ ID3FN_IMAGEFORMAT
Image format field.
Definition: globals.h:211
@ ID3FN_TIMESTAMPFORMAT
SYLT Timestamp Format.
Definition: globals.h:221
@ ID3FN_PEAKVOLLEFT
Peak volume on the left channel.
Definition: globals.h:220
@ ID3FN_RATING
Rating field.
Definition: globals.h:207
@ ID3FN_NUMBITS
Number of bits field.
Definition: globals.h:216
@ ID3FN_FILENAME
Filename field.
Definition: globals.h:208
@ ID3FN_OWNER
Owner field.
Definition: globals.h:205
@ ID3FN_LANGUAGE
Language field.
Definition: globals.h:209
@ ID3FN_TEXT
Text field.
Definition: globals.h:201
@ ID3FN_VOLUMEADJ
Volume adjustment field.
Definition: globals.h:215
@ ID3FN_URL
A URL.
Definition: globals.h:202
@ ID3FN_DATA
Data field.
Definition: globals.h:203
@ ID3FN_ID
Identifier/Symbol field.
Definition: globals.h:214
@ ID3FN_COUNTER
Counter field.
Definition: globals.h:213
@ ID3FN_PICTURETYPE
Picture type field.
Definition: globals.h:210
@ ID3FN_CONTENTTYPE
SYLT content type.
Definition: globals.h:222
@ ID3FN_TEXTENC
Text encoding (unicode or ASCII)
Definition: globals.h:200
ID3_TextEnc
Enumeration of the types of text encodings: ascii or unicode.
Definition: globals.h:138
@ ID3TE_NONE
Definition: globals.h:139
@ ID3TE_NUMENCODINGS
Definition: globals.h:144
@ ID3TE_ASCII
Definition: globals.h:145
@ ID3TE_UNICODE
Definition: globals.h:146
@ ID3V2_LATEST
Definition: globals.h:169
@ ID3V2_2_1
Definition: globals.h:165
@ ID3V2_EARLIEST
Definition: globals.h:168
@ ID3V2_3_0
Definition: globals.h:166
ID3_FrameID
Enumeration of the different types of frames recognized by id3lib.
Definition: globals.h:230
@ ID3FID_SYNCEDTEMPO
Synchronized tempo codes.
Definition: globals.h:259
@ ID3FID_LEADARTIST
Lead performer(s)/Soloist(s)
Definition: globals.h:292
@ ID3FID_CONTENTTYPE
Content type.
Definition: globals.h:263
@ ID3FID_BUFFERSIZE
Recommended buffer size.
Definition: globals.h:252
@ ID3FID_MIXARTIST
Interpreted, remixed, or otherwise modified by.
Definition: globals.h:295
@ ID3FID_BPM
BPM (beats per minute)
Definition: globals.h:261
@ ID3FID_GROUPINGREG
Group identification registration.
Definition: globals.h:242
@ ID3FID_ENCODERSETTINGS
Software/Hardware and settings used for encoding.
Definition: globals.h:308
@ ID3FID_SUBTITLE
Subtitle/Description refinement.
Definition: globals.h:279
@ ID3FID_ORIGARTIST
Original artist(s)/performer(s)
Definition: globals.h:289
@ ID3FID_ISRC
ISRC (international standard recording code)
Definition: globals.h:307
@ ID3FID_COMPOSER
Composer.
Definition: globals.h:262
@ ID3FID_MPEGLOOKUP
MPEG location lookup table.
Definition: globals.h:246
@ ID3FID_PUBLISHER
Publisher.
Definition: globals.h:298
@ ID3FID_AUDIOCRYPTO
Audio encryption.
Definition: globals.h:232
@ ID3FID_INVOLVEDPEOPLE
Involved people list.
Definition: globals.h:243
@ ID3FID_ORIGALBUM
Original album/movie/show title.
Definition: globals.h:286
@ ID3FID_PLAYLISTDELAY
Playlist delay.
Definition: globals.h:267
@ ID3FID_LANGUAGE
Language(s)
Definition: globals.h:281
@ ID3FID_WWWPUBLISHER
Official publisher webpage.
Definition: globals.h:322
@ ID3FID_WWWARTIST
Official artist/performer webpage.
Definition: globals.h:318
@ ID3FID_WWWPAYMENT
Payment.
Definition: globals.h:321
@ ID3FID_LYRICIST
Lyricist/Text writer.
Definition: globals.h:274
@ ID3FID_FILETYPE
File type.
Definition: globals.h:275
@ ID3FID_WWWAUDIOSOURCE
Official audio source webpage.
Definition: globals.h:319
@ ID3FID_METACRYPTO
Encrypted meta frame (id3v2.2.x)
Definition: globals.h:324
@ ID3FID_WWWAUDIOFILE
Official audio file webpage.
Definition: globals.h:317
@ ID3FID_TIME
Time.
Definition: globals.h:276
@ ID3FID_METACOMPRESSION
Compressed meta frame (id3v2.2.1)
Definition: globals.h:325
@ ID3FID_LASTFRAMEID
Last field placeholder.
Definition: globals.h:326
@ ID3FID_ENCODEDBY
Encoded by.
Definition: globals.h:273
@ ID3FID_WWWUSER
User defined URL link.
Definition: globals.h:323
@ ID3FID_POPULARIMETER
Popularimeter.
Definition: globals.h:250
@ ID3FID_PARTINSET
Part of a set.
Definition: globals.h:296
@ ID3FID_UNIQUEFILEID
Unique file identifier.
Definition: globals.h:312
@ ID3FID_GENERALOBJECT
General encapsulated object.
Definition: globals.h:241
@ ID3FID_REVERB
Reverb.
Definition: globals.h:255
@ ID3FID_USERTEXT
User defined text information.
Definition: globals.h:310
@ ID3FID_BAND
Band/orchestra/accompaniment.
Definition: globals.h:293
@ ID3FID_FILEOWNER
File owner/licensee.
Definition: globals.h:291
@ ID3FID_COMMERCIAL
Commercial frame.
Definition: globals.h:236
@ ID3FID_INITIALKEY
Initial key.
Definition: globals.h:280
@ ID3FID_ALBUM
Album/Movie/Show title.
Definition: globals.h:260
@ ID3FID_COMMENT
Comments.
Definition: globals.h:235
@ ID3FID_NETRADIOOWNER
Internet radio station owner.
Definition: globals.h:302
@ ID3FID_ORIGFILENAME
Original filename.
Definition: globals.h:287
@ ID3FID_EQUALIZATION
Equalization.
Definition: globals.h:239
@ ID3FID_COPYRIGHT
Copyright message.
Definition: globals.h:264
@ ID3FID_CRYPTOREG
Encryption method registration.
Definition: globals.h:237
@ ID3FID_RECORDINGDATES
Recording dates.
Definition: globals.h:300
@ ID3FID_SONGLEN
Length.
Definition: globals.h:282
@ ID3FID_POSITIONSYNC
Position synchronisation frame.
Definition: globals.h:251
@ ID3FID_WWWCOPYRIGHT
Copyright/Legal infromation.
Definition: globals.h:316
@ ID3FID_LINKEDINFO
Linked information.
Definition: globals.h:244
@ ID3FID_SIZE
Size.
Definition: globals.h:303
@ ID3FID_CONDUCTOR
Conductor/performer refinement.
Definition: globals.h:294
@ ID3FID_DATE
Date.
Definition: globals.h:265
@ ID3FID_YEAR
Year.
Definition: globals.h:311
@ ID3FID_NETRADIOSTATION
Internet radio station name.
Definition: globals.h:301
@ ID3FID_WWWCOMMERCIALINFO
Commercial information.
Definition: globals.h:315
@ ID3FID_MEDIATYPE
Media type.
Definition: globals.h:284
@ ID3FID_TERMSOFUSE
Terms of use.
Definition: globals.h:313
@ ID3FID_EVENTTIMING
Event timing codes.
Definition: globals.h:240
@ ID3FID_CONTENTGROUP
Content group description.
Definition: globals.h:277
@ ID3FID_NOFRAME
No known frame.
Definition: globals.h:231
@ ID3FID_OWNERSHIP
Ownership frame.
Definition: globals.h:247
@ ID3FID_PICTURE
Attached picture.
Definition: globals.h:233
@ ID3FID_TRACKNUM
Track number/Position in set.
Definition: globals.h:299
@ ID3FID_ORIGLYRICIST
Original lyricist(s)/text writer(s)
Definition: globals.h:288
@ ID3FID_UNSYNCEDLYRICS
Unsynchronized lyric/text transcription.
Definition: globals.h:314
@ ID3FID_VOLUMEADJ
Relative volume adjustment.
Definition: globals.h:254
@ ID3FID_ORIGYEAR
Original release year.
Definition: globals.h:290
@ ID3FID_CDID
Music CD identifier.
Definition: globals.h:245
@ ID3FID_TITLE
Title/songname/content description.
Definition: globals.h:278
@ ID3FID_SYNCEDLYRICS
Synchronized lyric/text.
Definition: globals.h:258
@ ID3FID_PRIVATE
Private frame.
Definition: globals.h:248
@ ID3FID_WWWRADIOPAGE
Official internet radio station homepage.
Definition: globals.h:320
@ ID3FID_PLAYCOUNTER
Play counter.
Definition: globals.h:249
@ ID3FF_ENCODABLE
Definition: globals.h:346
@ ID3FF_NONE
Definition: globals.h:343
@ ID3FF_CSTR
Definition: globals.h:344
@ ID3FF_TEXTLIST
Definition: globals.h:347
uint16 flags_t
Definition: globals.h:118
ID3_FieldType
Enumeration of the types of field types.
Definition: globals.h:352
@ ID3FTY_INTEGER
Definition: globals.h:354
@ ID3FTY_TEXTSTRING
Definition: globals.h:356
@ ID3FTY_NONE
Definition: globals.h:353
@ ID3FTY_BINARY
Definition: globals.h:355
Definition: tag_impl.h:42
String ID3_C_EXPORT convert(String data, ID3_TextEnc, ID3_TextEnc)
Definition: utils.cpp:185
ID3_FieldType _type
Definition: field_def.h:36
size_t _fixed_size
Definition: field_def.h:37
ID3_FieldID _id
Definition: field_def.h:35
static const ID3_FieldDef * DEFAULT
Definition: field_def.h:42
flags_t _flags
Definition: field_def.h:40
ID3_FrameID eID
Definition: frame_def.h:38
const ID3_FieldDef * aeFieldDefs
Definition: frame_def.h:43
char sShortTextID[3+1]
Definition: frame_def.h:39
const char * sDescription
Definition: frame_def.h:44
char sLongTextID[4+1]
Definition: frame_def.h:40