]> git.sesse.net Git - vlc/blob - include/vlc_meta.h
* vlc_meta.h: added a few const
[vlc] / include / vlc_meta.h
1 /*****************************************************************************
2  * vlc_meta.h
3  *****************************************************************************
4  * Copyright (C) 2004 VideoLAN
5  * $Id$
6  *
7  * Authors: Laurent Aimar <fenrir@via.ecp.fr>
8  *
9  * This program is free software; you can redistribute it and/or modify
10  * it under the terms of the GNU General Public License as published by
11  * the Free Software Foundation; either version 2 of the License, or
12  * (at your option) any later version.
13  *
14  * This program is distributed in the hope that it will be useful,
15  * but WITHOUT ANY WARRANTY; without even the implied warranty of
16  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
17  * GNU General Public License for more details.
18  *
19  * You should have received a copy of the GNU General Public License
20  * along with this program; if not, write to the Free Software
21  * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111, USA.
22  *****************************************************************************/
23
24 #ifndef _VLC_META_H
25 #define _VLC_META_H 1
26
27 /* VLC meta name */
28 #define VLC_META_TITLE              N_("Title")
29 #define VLC_META_AUTHOR             N_("Author")
30 #define VLC_META_ARTIST             N_("Artist")
31 #define VLC_META_GENRE              N_("Genre")
32 #define VLC_META_COPYRIGHT          N_("Copyright")
33 #define VLC_META_DESCRIPTION        N_("Description")
34 #define VLC_META_RATING             N_("Rating")
35 #define VLC_META_DATE               N_("Date")
36 #define VLC_META_SETTING            N_("Setting")
37 #define VLC_META_URL                N_("URL")
38 #define VLC_META_LANGUAGE           N_("Language")
39
40 #define VLC_META_CDDB_ARTIST        N_("CDDB Artist")
41 #define VLC_META_CDDB_CATEGORY      N_("CDDB Category")  
42 #define VLC_META_CDDB_DISCID        N_("CDDB Disc ID")
43 #define VLC_META_CDDB_EXT_DATA      N_("CDDB Extended Data")
44 #define VLC_META_CDDB_GENRE         N_("CDDB Genre")
45 #define VLC_META_CDDB_YEAR          N_("CDDB Year")      
46 #define VLC_META_CDDB_TITLE         N_("CDDB Title")
47
48 #define VLC_META_CDTEXT_ARRANGER    N_("CD-Text Arranger")
49 #define VLC_META_CDTEXT_COMPOSER    N_("CD-Text Composer")
50 #define VLC_META_CDTEXT_DISCID      N_("CD-Text Disc ID")
51 #define VLC_META_CDTEXT_GENRE       N_("CD-Text Genre")
52 #define VLC_META_CDTEXT_MESSAGE     N_("CD-Text Message")
53 #define VLC_META_CDTEXT_SONGWRITER  N_("CD-Text Songwriter")
54 #define VLC_META_CDTEXT_PERFORMER   N_("CD-Text Performer")
55 #define VLC_META_CDTEXT_TITLE       N_("CD-Text Title")
56
57 #define VLC_META_ISO_APPLICATION_ID N_("ISO-9660 Application ID") 
58 #define VLC_META_ISO_PREPARER       N_("ISO-9660 Preparer") 
59 #define VLC_META_ISO_PUBLISHER      N_("ISO-9660 Publisher") 
60 #define VLC_META_ISO_VOLUME         N_("ISO-9660 Volume") 
61 #define VLC_META_ISO_VOLUMESET      N_("ISO-9660 Volume Set") 
62
63 #define VLC_META_CODEC_NAME         N_("Codec Name")
64 #define VLC_META_CODEC_DESCRIPTION  N_("Codec Description")
65
66 struct vlc_meta_t
67 {
68     /* meta name/value pairs */
69     int     i_meta;
70     char    **name;
71     char    **value;
72
73     /* track meta information */
74     int         i_track;
75     vlc_meta_t  **track;
76 };
77
78 static inline vlc_meta_t *vlc_meta_New( void )
79 {
80     vlc_meta_t *m = (vlc_meta_t*)malloc( sizeof( vlc_meta_t ) );
81
82     m->i_meta = 0;
83     m->name   = NULL;
84     m->value  = NULL;
85
86     m->i_track= 0;
87     m->track  = NULL;
88
89     return m;
90 }
91
92 static inline void vlc_meta_Delete( vlc_meta_t *m )
93 {
94     int i;
95     for( i = 0; i < m->i_meta; i++ )
96     {
97         free( m->name[i] );
98         free( m->value[i] );
99     }
100     if( m->name ) free( m->name );
101     if( m->value ) free( m->value );
102
103     for( i = 0; i < m->i_track; i++ )
104     {
105         vlc_meta_Delete( m->track[i] );
106     }
107     if( m->track ) free( m->track );
108     free( m );
109 }
110
111 static inline void vlc_meta_Add( vlc_meta_t *m,
112                                  const char *name, const char *value )
113 {
114     m->name  = (char**)realloc( m->name, sizeof(char*) * ( m->i_meta + 1 ) );
115     m->name[m->i_meta] = strdup( name );
116
117     m->value = (char**)realloc( m->value, sizeof(char*) * ( m->i_meta + 1 ) );
118     m->value[m->i_meta] = strdup( value );
119
120     m->i_meta++;
121 }
122
123 static inline vlc_meta_t *vlc_meta_Duplicate( vlc_meta_t *src )
124 {
125     vlc_meta_t *dst = vlc_meta_New();
126     int i;
127     for( i = 0; i < src->i_meta; i++ )
128     {
129         vlc_meta_Add( dst, src->name[i], src->value[i] );
130     }
131     for( i = 0; i < src->i_track; i++ )
132     {
133         vlc_meta_t *tk = vlc_meta_Duplicate( src->track[i] );
134
135         dst->track = (vlc_meta_t**)realloc( dst->track, sizeof( vlc_meta_t* ) * (dst->i_track+1) );
136         dst->track[dst->i_track++] = tk;
137     }
138     return dst;
139 }
140
141 static inline void vlc_meta_Merge( vlc_meta_t *dst, vlc_meta_t *src )
142 {
143     int i, j;
144     for( i = 0; i < src->i_meta; i++ )
145     {
146         /* Check if dst contains the entry */
147         for( j = 0; j < dst->i_meta; j++ )
148         {
149             if( !strcmp( src->name[i], dst->name[j] ) ) break;
150         }
151         if( j < dst->i_meta )
152         {
153             if( dst->value[j] ) free( dst->value[j] );
154             dst->value[j] = strdup( src->value[i] );
155         }
156         else vlc_meta_Add( dst, src->name[i], src->value[i] );
157     }
158 }
159
160 static inline char *vlc_meta_GetValue( vlc_meta_t *m, const char *name )
161 {
162     int i;
163
164     for( i = 0; i < m->i_meta; i++ )
165     {
166         if( !strcmp( m->name[i], name ) )
167         {
168             char *value = NULL;
169             if( m->value[i] ) value = strdup( m->value[i] );
170             return value;
171         }
172     }
173     return NULL;
174 }
175
176 #endif