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