1 /*
2 * libcddb - CDDB Interface Library for xmcd/cda
3 *
4 * This library implements an interface to access the "classic"
5 * CDDB1 services.
6 *
7 * Copyright (C) 1993-2004 Ti Kan
8 * E-mail: xmcd@amb.org
9 *
10 * This program is free software; you can redistribute it and/or modify
11 * it under the terms of the GNU General Public License as published by
12 * the Free Software Foundation; either version 2 of the License, or
13 * (at your option) any later version.
14 *
15 * This program is distributed in the hope that it will be useful,
16 * but WITHOUT ANY WARRANTY; without even the implied warranty of
17 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
18 * GNU General Public License for more details.
19 *
20 * You should have received a copy of the GNU General Public License
21 * along with this program; if not, write to the Free Software
22 * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
23 *
24 */
25 #ifndef lint
26 static char *_segment_c_ident_ = "@(#)segment.c 1.16 03/12/12";
27 #endif
28
29 #include "fcddb.h"
30
31
32 /*
33 * CddbSegment_AddCredit
34 * Add a credit to the segment
35 */
36 CddbResult
CddbSegment_AddCredit(CddbSegmentPtr segp,CddbConstStr id,CddbConstStr name,CddbCreditPtr * pval)37 CddbSegment_AddCredit(
38 CddbSegmentPtr segp,
39 CddbConstStr id,
40 CddbConstStr name,
41 CddbCreditPtr *pval
42 )
43 {
44 cddb_segment_t *sp = (cddb_segment_t *) segp;
45 cddb_control_t *cp;
46 cddb_rolelist_t *rlp;
47 cddb_role_t *rp;
48 cddb_credit_t *p;
49
50 if (pval == NULL)
51 return Cddb_E_INVALIDARG;
52
53 if (segp == NULL || id == NULL || id[0] == '\0' ||
54 name == NULL || name[0] == '\0') {
55 *pval = NULL;
56 return Cddb_E_INVALIDARG;
57 }
58
59 p = (cddb_credit_t *) MEM_ALLOC(
60 "CddbCredit", sizeof(cddb_credit_t)
61 );
62 *pval = (CddbCreditPtr) p;
63
64 if (p == NULL)
65 return CDDBTRNOutOfMemory;
66
67 (void) memset(p, 0, sizeof(cddb_credit_t));
68 (void) strcpy(p->objtype, "CddbCredit");
69
70 cp = (cddb_control_t *) sp->control;
71 p->role = NULL;
72 for (rlp = cp->roletree.rolelists; rlp != NULL; rlp = rlp->next) {
73 for (rp = rlp->subroles; rp != NULL; rp = rp->next) {
74 if (strcmp(rp->id, id) == 0) {
75 p->role = rp;
76 break;
77 }
78 }
79 if (p->role != NULL)
80 break;
81 }
82 p->fullname.name = (CddbStr) fcddb_strdup((char *) name);
83
84 /* Add to list */
85 p = sp->credits.credits;
86 sp->credits.credits = p;
87 sp->credits.count++;
88
89 return Cddb_OK;
90 }
91
92
93 /*
94 * CddbSegment_GetCredit
95 * Return a credit of the segment
96 */
97 CddbResult
CddbSegment_GetCredit(CddbSegmentPtr segp,long item,CddbCreditPtr * pval)98 CddbSegment_GetCredit(
99 CddbSegmentPtr segp,
100 long item,
101 CddbCreditPtr *pval
102 )
103 {
104 cddb_segment_t *sp = (cddb_segment_t *) segp;
105 cddb_credit_t *cp;
106 long i;
107
108 for (i = 1, cp = sp->credits.credits; cp != NULL; i++, cp = cp->next) {
109 if (i < item)
110 continue;
111
112 *pval = (CddbCreditPtr) cp;
113 return Cddb_OK;
114 }
115
116 *pval = NULL;
117 return Cddb_E_INVALIDARG;
118 }
119
120
121 /*
122 * CddbSegment_GetEndFrame
123 * Return the segment end frame
124 */
125 CddbResult
CddbSegment_GetEndFrame(CddbSegmentPtr segp,CddbStr * pval)126 CddbSegment_GetEndFrame(CddbSegmentPtr segp, CddbStr *pval)
127 {
128 cddb_segment_t *sp = (cddb_segment_t *) segp;
129
130 *pval = (CddbStr) (sp->endframe == NULL ? "" : sp->endframe);
131 return Cddb_OK;
132 }
133
134
135 /*
136 * CddbSegment_GetEndTrack
137 * Return the segment end track
138 */
139 CddbResult
CddbSegment_GetEndTrack(CddbSegmentPtr segp,CddbStr * pval)140 CddbSegment_GetEndTrack(CddbSegmentPtr segp, CddbStr *pval)
141 {
142 cddb_segment_t *sp = (cddb_segment_t *) segp;
143
144 *pval = (CddbStr) (sp->endtrack == NULL ? "" : sp->endtrack);
145 return Cddb_OK;
146 }
147
148
149 /*
150 * CddbSegment_GetName
151 * Return the segment name
152 */
153 CddbResult
CddbSegment_GetName(CddbSegmentPtr segp,CddbStr * pval)154 CddbSegment_GetName(CddbSegmentPtr segp, CddbStr *pval)
155 {
156 cddb_segment_t *sp = (cddb_segment_t *) segp;
157
158 *pval = (CddbStr) (sp->name == NULL ? "" : sp->name);
159 return Cddb_OK;
160 }
161
162
163 /*
164 * CddbSegment_GetNotes
165 * Return the segment notes
166 */
167 CddbResult
CddbSegment_GetNotes(CddbSegmentPtr segp,CddbStr * pval)168 CddbSegment_GetNotes(CddbSegmentPtr segp, CddbStr *pval)
169 {
170 cddb_segment_t *sp = (cddb_segment_t *) segp;
171
172 *pval = (CddbStr) (sp->notes == NULL ? "" : sp->notes);
173 return Cddb_OK;
174 }
175
176
177 /*
178 * CddbSegment_GetNumCredits
179 * Return the number of segment credits
180 */
181 /*ARGSUSED*/
182 CddbResult
CddbSegment_GetNumCredits(CddbSegmentPtr segp,long * pval)183 CddbSegment_GetNumCredits(CddbSegmentPtr segp, long *pval)
184 {
185 *pval = 0; /* Not supported in CDDB1 */
186 return Cddb_OK;
187 }
188
189
190 /*
191 * CddbSegment_GetStartFrame
192 * Return the segment start frame
193 */
194 CddbResult
CddbSegment_GetStartFrame(CddbSegmentPtr segp,CddbStr * pval)195 CddbSegment_GetStartFrame(CddbSegmentPtr segp, CddbStr *pval)
196 {
197 cddb_segment_t *sp = (cddb_segment_t *) segp;
198
199 *pval = (CddbStr) (sp->startframe == NULL ? "" : sp->startframe);
200 return Cddb_OK;
201 }
202
203
204 /*
205 * CddbSegment_GetStartTrack
206 * Return the segment start track
207 */
208 CddbResult
CddbSegment_GetStartTrack(CddbSegmentPtr segp,CddbStr * pval)209 CddbSegment_GetStartTrack(CddbSegmentPtr segp, CddbStr *pval)
210 {
211 cddb_segment_t *sp = (cddb_segment_t *) segp;
212
213 *pval = (CddbStr) (sp->starttrack == NULL ? "" : sp->starttrack);
214 return Cddb_OK;
215 }
216
217
218 /*
219 * CddbSegment_PutEndFrame
220 * Set the segment end frame
221 */
222 CddbResult
CddbSegment_PutEndFrame(CddbSegmentPtr segp,CddbConstStr newval)223 CddbSegment_PutEndFrame(CddbSegmentPtr segp, CddbConstStr newval)
224 {
225 cddb_segment_t *sp = (cddb_segment_t *) segp;
226
227 if (sp->endframe != NULL)
228 MEM_FREE(sp->endframe);
229
230 if (newval == NULL || newval[0] == '\0')
231 sp->endframe = NULL;
232 else
233 sp->endframe = (CddbStr) fcddb_strdup((char *) newval);
234
235 return Cddb_OK;
236 }
237
238
239 /*
240 * CddbSegment_PutEndTrack
241 * Set the segment end track
242 */
243 CddbResult
CddbSegment_PutEndTrack(CddbSegmentPtr segp,CddbConstStr newval)244 CddbSegment_PutEndTrack(CddbSegmentPtr segp, CddbConstStr newval)
245 {
246 cddb_segment_t *sp = (cddb_segment_t *) segp;
247
248 if (sp->endtrack != NULL)
249 MEM_FREE(sp->endtrack);
250
251 if (newval == NULL || newval[0] == '\0')
252 sp->endtrack = NULL;
253 else
254 sp->endtrack = (CddbStr) fcddb_strdup((char *) newval);
255
256 return Cddb_OK;
257 }
258
259
260 /*
261 * CddbSegment_PutNotes
262 * Set the segment notes
263 */
264 CddbResult
CddbSegment_PutNotes(CddbSegmentPtr segp,CddbConstStr newval)265 CddbSegment_PutNotes(CddbSegmentPtr segp, CddbConstStr newval)
266 {
267 cddb_segment_t *sp = (cddb_segment_t *) segp;
268
269 if (sp->notes != NULL)
270 MEM_FREE(sp->notes);
271
272 if (newval == NULL || newval[0] == '\0')
273 sp->notes = NULL;
274 else
275 sp->notes = (CddbStr) fcddb_strdup((char *) newval);
276
277 return Cddb_OK;
278 }
279
280
281 /*
282 * CddbSegment_PutStartFrame
283 * Set the segment start frame
284 */
285 CddbResult
CddbSegment_PutStartFrame(CddbSegmentPtr segp,CddbConstStr newval)286 CddbSegment_PutStartFrame(CddbSegmentPtr segp, CddbConstStr newval)
287 {
288 cddb_segment_t *sp = (cddb_segment_t *) segp;
289
290 if (sp->startframe != NULL)
291 MEM_FREE(sp->startframe);
292
293 if (newval == NULL || newval[0] == '\0')
294 sp->startframe = NULL;
295 else
296 sp->startframe = (CddbStr) fcddb_strdup((char *) newval);
297
298 return Cddb_OK;
299 }
300
301
302 /*
303 * CddbSegment_PutStartTrack
304 * Set the segment start track
305 */
306 CddbResult
CddbSegment_PutStartTrack(CddbSegmentPtr segp,CddbConstStr newval)307 CddbSegment_PutStartTrack(CddbSegmentPtr segp, CddbConstStr newval)
308 {
309 cddb_segment_t *sp = (cddb_segment_t *) segp;
310
311 if (sp->starttrack != NULL)
312 MEM_FREE(sp->starttrack);
313
314 if (newval == NULL || newval[0] == '\0')
315 sp->starttrack = NULL;
316 else
317 sp->starttrack = (CddbStr) fcddb_strdup((char *) newval);
318
319 return Cddb_OK;
320 }
321
322
323