1 /* --------------------------------------------------------------------------
2 
3    libmusicbrainz5 - Client library to access MusicBrainz
4 
5    Copyright (C) 2012 Andrew Hawkins
6 
7    This file is part of libmusicbrainz5.
8 
9    This library is free software; you can redistribute it and/or
10    modify it under the terms of the GNU Lesser General Public
11    License as published by the Free Software Foundation; either
12    version 2.1 of the License, or (at your option) any later version.
13 
14    libmusicbrainz5 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 GNU
17    Lesser General Public License for more details.
18 
19    You should have received a copy of the GNU General Public License
20    along with this library.  If not, see <http://www.gnu.org/licenses/>.
21 
22      $Id$
23 
24 ----------------------------------------------------------------------------*/
25 
26 #include "config.h"
27 #include "musicbrainz5/defines.h"
28 
29 #include "musicbrainz5/Metadata.h"
30 
31 #include "musicbrainz5/Artist.h"
32 #include "musicbrainz5/ArtistList.h"
33 #include "musicbrainz5/Release.h"
34 #include "musicbrainz5/ReleaseList.h"
35 #include "musicbrainz5/ReleaseGroup.h"
36 #include "musicbrainz5/ReleaseGroupList.h"
37 #include "musicbrainz5/Recording.h"
38 #include "musicbrainz5/RecordingList.h"
39 #include "musicbrainz5/Label.h"
40 #include "musicbrainz5/LabelList.h"
41 #include "musicbrainz5/Work.h"
42 #include "musicbrainz5/WorkList.h"
43 #include "musicbrainz5/PUID.h"
44 #include "musicbrainz5/ISRC.h"
45 #include "musicbrainz5/ISRCList.h"
46 #include "musicbrainz5/Disc.h"
47 #include "musicbrainz5/Rating.h"
48 #include "musicbrainz5/UserRating.h"
49 #include "musicbrainz5/Collection.h"
50 #include "musicbrainz5/CollectionList.h"
51 #include "musicbrainz5/Annotation.h"
52 #include "musicbrainz5/AnnotationList.h"
53 #include "musicbrainz5/CDStub.h"
54 #include "musicbrainz5/CDStubList.h"
55 #include "musicbrainz5/FreeDBDisc.h"
56 #include "musicbrainz5/FreeDBDiscList.h"
57 #include "musicbrainz5/Tag.h"
58 #include "musicbrainz5/TagList.h"
59 #include "musicbrainz5/UserTag.h"
60 #include "musicbrainz5/UserTagList.h"
61 #include "musicbrainz5/LabelInfo.h"
62 #include "musicbrainz5/LabelInfoList.h"
63 #include "musicbrainz5/Message.h"
64 
65 class MusicBrainz5::CMetadataPrivate
66 {
67 	public:
CMetadataPrivate()68 		CMetadataPrivate()
69 		:	m_Artist(0),
70 			m_Release(0),
71 			m_ReleaseGroup(0),
72 			m_Recording(0),
73 			m_Label(0),
74 			m_Work(0),
75 			m_PUID(0),
76 			m_ISRC(0),
77 			m_Disc(0),
78 			m_LabelInfoList(0),
79 			m_Rating(0),
80 			m_UserRating(0),
81 			m_Collection(0),
82 			m_ArtistList(0),
83 			m_ReleaseList(0),
84 			m_ReleaseGroupList(0),
85 			m_RecordingList(0),
86 			m_LabelList(0),
87 			m_WorkList(0),
88 			m_ISRCList(0),
89 			m_AnnotationList(0),
90 			m_CDStubList(0),
91 			m_FreeDBDiscList(0),
92 			m_TagList(0),
93 			m_UserTagList(0),
94 			m_CollectionList(0),
95 			m_CDStub(0),
96 			m_Message(0)
97 		{
98 		}
99 
100 		std::string m_XMLNS;
101 		std::string m_XMLNSExt;
102 		std::string m_Generator;
103 		std::string m_Created;
104 		CArtist *m_Artist;
105 		CRelease *m_Release;
106 		CReleaseGroup *m_ReleaseGroup;
107 		CRecording *m_Recording;
108 		CLabel *m_Label;
109 		CWork *m_Work;
110 		CPUID *m_PUID;
111 		CISRC *m_ISRC;
112 		CDisc *m_Disc;
113 		CLabelInfoList *m_LabelInfoList;
114 		CRating *m_Rating;
115 		CUserRating *m_UserRating;
116 		CCollection *m_Collection;
117 		CArtistList *m_ArtistList;
118 		CReleaseList *m_ReleaseList;
119 		CReleaseGroupList *m_ReleaseGroupList;
120 		CRecordingList *m_RecordingList;
121 		CLabelList *m_LabelList;
122 		CWorkList *m_WorkList;
123 		CISRCList *m_ISRCList;
124 		CAnnotationList *m_AnnotationList;
125 		CCDStubList *m_CDStubList;
126 		CFreeDBDiscList *m_FreeDBDiscList;
127 		CTagList *m_TagList;
128 		CUserTagList *m_UserTagList;
129 		CCollectionList *m_CollectionList;
130 		CCDStub *m_CDStub;
131 		CMessage *m_Message;
132 };
133 
CMetadata(const XMLNode & Node)134 MusicBrainz5::CMetadata::CMetadata(const XMLNode& Node)
135 :	CEntity(),
136 	m_d(new CMetadataPrivate)
137 {
138 	if (!Node.isEmpty())
139 	{
140 		//std::cout << "Metadata node: " << std::endl << Node.createXMLString(true) << std::endl;
141 
142 		Parse(Node);
143 	}
144 }
145 
CMetadata(const CMetadata & Other)146 MusicBrainz5::CMetadata::CMetadata(const CMetadata& Other)
147 :	CEntity(),
148 	m_d(new CMetadataPrivate)
149 {
150 	*this=Other;
151 }
152 
operator =(const CMetadata & Other)153 MusicBrainz5::CMetadata& MusicBrainz5::CMetadata::operator =(const CMetadata& Other)
154 {
155 	if (this!=&Other)
156 	{
157 		Cleanup();
158 
159 		CEntity::operator =(Other);
160 
161 		m_d->m_XMLNS=Other.m_d->m_XMLNS;
162 		m_d->m_XMLNSExt=Other.m_d->m_XMLNSExt;
163 		m_d->m_Generator=Other.m_d->m_Generator;
164 		m_d->m_Created=Other.m_d->m_Created;
165 
166 		if (Other.m_d->m_Artist)
167 			m_d->m_Artist=new CArtist(*Other.m_d->m_Artist);
168 
169 		if (Other.m_d->m_Release)
170 			m_d->m_Release=new CRelease(*Other.m_d->m_Release);
171 
172 		if (Other.m_d->m_ReleaseGroup)
173 			m_d->m_ReleaseGroup=new CReleaseGroup(*Other.m_d->m_ReleaseGroup);
174 
175 		if (Other.m_d->m_Recording)
176 			m_d->m_Recording=new CRecording(*Other.m_d->m_Recording);
177 
178 		if (Other.m_d->m_Label)
179 			m_d->m_Label=new CLabel(*Other.m_d->m_Label);
180 
181 		if (Other.m_d->m_Work)
182 			m_d->m_Work=new CWork(*Other.m_d->m_Work);
183 
184 		if (Other.m_d->m_PUID)
185 			m_d->m_PUID=new CPUID(*Other.m_d->m_PUID);
186 
187 		if (Other.m_d->m_ISRC)
188 			m_d->m_ISRC=new CISRC(*Other.m_d->m_ISRC);
189 
190 		if (Other.m_d->m_Disc)
191 			m_d->m_Disc=new CDisc(*Other.m_d->m_Disc);
192 
193 		if (Other.m_d->m_LabelInfoList)
194 			m_d->m_LabelInfoList=new CLabelInfoList(*Other.m_d->m_LabelInfoList);
195 
196 		if (Other.m_d->m_Rating)
197 			m_d->m_Rating=new CRating(*Other.m_d->m_Rating);
198 
199 		if (Other.m_d->m_UserRating)
200 			m_d->m_UserRating=new CUserRating(*Other.m_d->m_UserRating);
201 
202 		if (Other.m_d->m_Collection)
203 			m_d->m_Collection=new CCollection(*Other.m_d->m_Collection);
204 
205 		if (Other.m_d->m_ArtistList)
206 			m_d->m_ArtistList=new CArtistList(*Other.m_d->m_ArtistList);
207 
208 		if (Other.m_d->m_ReleaseList)
209 			m_d->m_ReleaseList=new CReleaseList(*Other.m_d->m_ReleaseList);
210 
211 		if (Other.m_d->m_ReleaseGroupList)
212 			m_d->m_ReleaseGroupList=new CReleaseGroupList(*Other.m_d->m_ReleaseGroupList);
213 
214 		if (Other.m_d->m_RecordingList)
215 			m_d->m_RecordingList=new CRecordingList(*Other.m_d->m_RecordingList);
216 
217 		if (Other.m_d->m_LabelList)
218 			m_d->m_LabelList=new CLabelList(*Other.m_d->m_LabelList);
219 
220 		if (Other.m_d->m_WorkList)
221 			m_d->m_WorkList=new CWorkList(*Other.m_d->m_WorkList);
222 
223 		if (Other.m_d->m_ISRCList)
224 			m_d->m_ISRCList=new CISRCList(*Other.m_d->m_ISRCList);
225 
226 		if (Other.m_d->m_AnnotationList)
227 			m_d->m_AnnotationList=new CAnnotationList(*Other.m_d->m_AnnotationList);
228 
229 		if (Other.m_d->m_CDStubList)
230 			m_d->m_CDStubList=new CCDStubList(*Other.m_d->m_CDStubList);
231 
232 		if (Other.m_d->m_FreeDBDiscList)
233 			m_d->m_FreeDBDiscList=new CFreeDBDiscList(*Other.m_d->m_FreeDBDiscList);
234 
235 		if (Other.m_d->m_TagList)
236 			m_d->m_TagList=new CTagList(*Other.m_d->m_TagList);
237 
238 		if (Other.m_d->m_UserTagList)
239 			m_d->m_UserTagList=new CUserTagList(*Other.m_d->m_UserTagList);
240 
241 		if (Other.m_d->m_CollectionList)
242 			m_d->m_CollectionList=new CCollectionList(*Other.m_d->m_CollectionList);
243 
244 		if (Other.m_d->m_CDStub)
245 			m_d->m_CDStub=new CCDStub(*Other.m_d->m_CDStub);
246 
247 		if (Other.m_d->m_Message)
248 			m_d->m_Message=new CMessage(*Other.m_d->m_Message);
249 	}
250 
251 	return *this;
252 }
253 
~CMetadata()254 MusicBrainz5::CMetadata::~CMetadata()
255 {
256 	Cleanup();
257 
258 	delete m_d;
259 }
260 
Cleanup()261 void MusicBrainz5::CMetadata::Cleanup()
262 {
263 	delete m_d->m_Artist;
264 	m_d->m_Artist=0;
265 
266 	delete m_d->m_Release;
267 	m_d->m_Release=0;
268 
269 	delete m_d->m_ReleaseGroup;
270 	m_d->m_ReleaseGroup=0;
271 
272 	delete m_d->m_Recording;
273 	m_d->m_Recording=0;
274 
275 	delete m_d->m_Label;
276 	m_d->m_Label=0;
277 
278 	delete m_d->m_Work;
279 	m_d->m_Work=0;
280 
281 	delete m_d->m_PUID;
282 	m_d->m_PUID=0;
283 
284 	delete m_d->m_ISRC;
285 	m_d->m_ISRC=0;
286 
287 	delete m_d->m_Disc;
288 	m_d->m_Disc=0;
289 
290 	delete m_d->m_LabelInfoList;
291 	m_d->m_LabelInfoList=0;
292 
293 	delete m_d->m_Rating;
294 	m_d->m_Rating=0;
295 
296 	delete m_d->m_UserRating;
297 	m_d->m_UserRating=0;
298 
299 	delete m_d->m_Collection;
300 	m_d->m_Collection=0;
301 
302 	delete m_d->m_ArtistList;
303 	m_d->m_ArtistList=0;
304 
305 	delete m_d->m_ReleaseList;
306 	m_d->m_ReleaseList=0;
307 
308 	delete m_d->m_ReleaseGroupList;
309 	m_d->m_ReleaseGroupList=0;
310 
311 	delete m_d->m_RecordingList;
312 	m_d->m_RecordingList=0;
313 
314 	delete m_d->m_LabelList;
315 	m_d->m_LabelList=0;
316 
317 	delete m_d->m_WorkList;
318 	m_d->m_WorkList=0;
319 
320 	delete m_d->m_ISRCList;
321 	m_d->m_ISRCList=0;
322 
323 	delete m_d->m_AnnotationList;
324 	m_d->m_AnnotationList=0;
325 
326 	delete m_d->m_CDStubList;
327 	m_d->m_CDStubList=0;
328 
329 	delete m_d->m_FreeDBDiscList;
330 	m_d->m_FreeDBDiscList=0;
331 
332 	delete m_d->m_TagList;
333 	m_d->m_TagList=0;
334 
335 	delete m_d->m_UserTagList;
336 	m_d->m_UserTagList=0;
337 
338 	delete m_d->m_CollectionList;
339 	m_d->m_CollectionList=0;
340 
341 	delete m_d->m_CDStub;
342 	m_d->m_CDStub=0;
343 
344 	delete m_d->m_Message;
345 	m_d->m_Message=0;
346 }
347 
Clone()348 MusicBrainz5::CMetadata *MusicBrainz5::CMetadata::Clone()
349 {
350 	return new CMetadata(*this);
351 }
352 
ParseAttribute(const std::string & Name,const std::string & Value)353 void MusicBrainz5::CMetadata::ParseAttribute(const std::string& Name, const std::string& Value)
354 {
355 	if ("xmlns"==Name)
356 		m_d->m_XMLNS=Value;
357 	else if ("xmlns:ext"==Name)
358 		m_d->m_XMLNSExt=Value;
359 	else if ("generator"==Name)
360 		m_d->m_Generator=Value;
361 	else if ("created"==Name)
362 		m_d->m_Created=Value;
363 	else
364 	{
365 #ifdef _MB5_DEBUG_
366 		std::cerr << "Unrecognised metadata attribute: '" << Name << "'" << std::endl;
367 #endif
368 	}
369 }
370 
ParseElement(const XMLNode & Node)371 void MusicBrainz5::CMetadata::ParseElement(const XMLNode& Node)
372 {
373 	std::string NodeName=Node.getName();
374 
375 	if ("artist"==NodeName)
376 	{
377 		ProcessItem(Node,m_d->m_Artist);
378 	}
379 	else if ("release"==NodeName)
380 	{
381 		ProcessItem(Node,m_d->m_Release);
382 	}
383 	else if ("release-group"==NodeName)
384 	{
385 		ProcessItem(Node,m_d->m_ReleaseGroup);
386 	}
387 	else if ("recording"==NodeName)
388 	{
389 		ProcessItem(Node,m_d->m_Recording);
390 	}
391 	else if ("label"==NodeName)
392 	{
393 		ProcessItem(Node,m_d->m_Label);
394 	}
395 	else if ("work"==NodeName)
396 	{
397 		ProcessItem(Node,m_d->m_Work);
398 	}
399 	else if ("puid"==NodeName)
400 	{
401 		ProcessItem(Node,m_d->m_PUID);
402 	}
403 	else if ("isrc"==NodeName)
404 	{
405 		ProcessItem(Node,m_d->m_ISRC);
406 	}
407 	else if ("disc"==NodeName)
408 	{
409 		ProcessItem(Node,m_d->m_Disc);
410 	}
411 	else if ("rating"==NodeName)
412 	{
413 		ProcessItem(Node,m_d->m_Rating);
414 	}
415 	else if ("user-rating"==NodeName)
416 	{
417 		ProcessItem(Node,m_d->m_UserRating);
418 	}
419 	else if ("collection"==NodeName)
420 	{
421 		ProcessItem(Node,m_d->m_Collection);
422 	}
423 	else if ("artist-list"==NodeName)
424 	{
425 		ProcessItem(Node,m_d->m_ArtistList);
426 	}
427 	else if ("release-list"==NodeName)
428 	{
429 		ProcessItem(Node,m_d->m_ReleaseList);
430 	}
431 	else if ("release-group-list"==NodeName)
432 	{
433 		ProcessItem(Node,m_d->m_ReleaseGroupList);
434 	}
435 	else if ("recording-list"==NodeName)
436 	{
437 		ProcessItem(Node,m_d->m_RecordingList);
438 	}
439 	else if ("label-list"==NodeName)
440 	{
441 		ProcessItem(Node,m_d->m_LabelList);
442 	}
443 	else if ("work-list"==NodeName)
444 	{
445 		ProcessItem(Node,m_d->m_WorkList);
446 	}
447 	else if ("isrc-list"==NodeName)
448 	{
449 		ProcessItem(Node,m_d->m_ISRCList);
450 	}
451 	else if ("annotation-list"==NodeName)
452 	{
453 		ProcessItem(Node,m_d->m_AnnotationList);
454 	}
455 	else if ("cdstub-list"==NodeName)
456 	{
457 		ProcessItem(Node,m_d->m_CDStubList);
458 	}
459 	else if ("freedb-disc-list"==NodeName)
460 	{
461 		ProcessItem(Node,m_d->m_FreeDBDiscList);
462 	}
463 	else if ("tag-list"==NodeName)
464 	{
465 		ProcessItem(Node,m_d->m_TagList);
466 	}
467 	else if ("user-tag-list"==NodeName)
468 	{
469 		ProcessItem(Node,m_d->m_UserTagList);
470 	}
471 	else if ("collection-list"==NodeName)
472 	{
473 		ProcessItem(Node,m_d->m_CollectionList);
474 	}
475 	else if ("cdstub"==NodeName)
476 	{
477 		ProcessItem(Node,m_d->m_CDStub);
478 	}
479 	else if ("message"==NodeName)
480 	{
481 		ProcessItem(Node,m_d->m_Message);
482 	}
483 	else
484 	{
485 #ifdef _MB5_DEBUG_
486 		std::cerr << "Unrecognised metadata element: '" << NodeName << "'" << std::endl;
487 #endif
488 	}
489 }
490 
GetElementName()491 std::string MusicBrainz5::CMetadata::GetElementName()
492 {
493 	return "metadata";
494 }
495 
XMLNS() const496 std::string MusicBrainz5::CMetadata::XMLNS() const
497 {
498 	return m_d->m_XMLNS;
499 }
500 
XMLNSExt() const501 std::string MusicBrainz5::CMetadata::XMLNSExt() const
502 {
503 	return m_d->m_XMLNSExt;
504 }
505 
Generator() const506 std::string MusicBrainz5::CMetadata::Generator() const
507 {
508 	return m_d->m_Generator;
509 }
510 
Created() const511 std::string MusicBrainz5::CMetadata::Created() const
512 {
513 	return m_d->m_Created;
514 }
515 
Artist() const516 MusicBrainz5::CArtist *MusicBrainz5::CMetadata::Artist() const
517 {
518 	return m_d->m_Artist;
519 }
520 
Release() const521 MusicBrainz5::CRelease *MusicBrainz5::CMetadata::Release() const
522 {
523 	return m_d->m_Release;
524 }
525 
ReleaseGroup() const526 MusicBrainz5::CReleaseGroup *MusicBrainz5::CMetadata::ReleaseGroup() const
527 {
528 	return m_d->m_ReleaseGroup;
529 }
530 
Recording() const531 MusicBrainz5::CRecording *MusicBrainz5::CMetadata::Recording() const
532 {
533 	return m_d->m_Recording;
534 }
535 
Label() const536 MusicBrainz5::CLabel *MusicBrainz5::CMetadata::Label() const
537 {
538 	return m_d->m_Label;
539 }
540 
Work() const541 MusicBrainz5::CWork *MusicBrainz5::CMetadata::Work() const
542 {
543 	return m_d->m_Work;
544 }
545 
PUID() const546 MusicBrainz5::CPUID *MusicBrainz5::CMetadata::PUID() const
547 {
548 	return m_d->m_PUID;
549 }
550 
ISRC() const551 MusicBrainz5::CISRC *MusicBrainz5::CMetadata::ISRC() const
552 {
553 	return m_d->m_ISRC;
554 }
555 
Disc() const556 MusicBrainz5::CDisc *MusicBrainz5::CMetadata::Disc() const
557 {
558 	return m_d->m_Disc;
559 }
560 
LabelInfoList() const561 MusicBrainz5::CLabelInfoList *MusicBrainz5::CMetadata::LabelInfoList() const
562 {
563 	return m_d->m_LabelInfoList;
564 }
565 
Rating() const566 MusicBrainz5::CRating *MusicBrainz5::CMetadata::Rating() const
567 {
568 	return m_d->m_Rating;
569 }
570 
UserRating() const571 MusicBrainz5::CUserRating *MusicBrainz5::CMetadata::UserRating() const
572 {
573 	return m_d->m_UserRating;
574 }
575 
Collection() const576 MusicBrainz5::CCollection *MusicBrainz5::CMetadata::Collection() const
577 {
578 	return m_d->m_Collection;
579 }
580 
ArtistList() const581 MusicBrainz5::CArtistList *MusicBrainz5::CMetadata::ArtistList() const
582 {
583 	return m_d->m_ArtistList;
584 }
585 
ReleaseList() const586 MusicBrainz5::CReleaseList *MusicBrainz5::CMetadata::ReleaseList() const
587 {
588 	return m_d->m_ReleaseList;
589 }
590 
ReleaseGroupList() const591 MusicBrainz5::CReleaseGroupList *MusicBrainz5::CMetadata::ReleaseGroupList() const
592 {
593 	return m_d->m_ReleaseGroupList;
594 }
595 
RecordingList() const596 MusicBrainz5::CRecordingList *MusicBrainz5::CMetadata::RecordingList() const
597 {
598 	return m_d->m_RecordingList;
599 }
600 
LabelList() const601 MusicBrainz5::CLabelList *MusicBrainz5::CMetadata::LabelList() const
602 {
603 	return m_d->m_LabelList;
604 }
605 
WorkList() const606 MusicBrainz5::CWorkList *MusicBrainz5::CMetadata::WorkList() const
607 {
608 	return m_d->m_WorkList;
609 }
610 
ISRCList() const611 MusicBrainz5::CISRCList *MusicBrainz5::CMetadata::ISRCList() const
612 {
613 	return m_d->m_ISRCList;
614 }
615 
AnnotationList() const616 MusicBrainz5::CAnnotationList *MusicBrainz5::CMetadata::AnnotationList() const
617 {
618 	return m_d->m_AnnotationList;
619 }
620 
CDStubList() const621 MusicBrainz5::CCDStubList *MusicBrainz5::CMetadata::CDStubList() const
622 {
623 	return m_d->m_CDStubList;
624 }
625 
FreeDBDiscList() const626 MusicBrainz5::CFreeDBDiscList *MusicBrainz5::CMetadata::FreeDBDiscList() const
627 {
628 	return m_d->m_FreeDBDiscList;
629 }
630 
TagList() const631 MusicBrainz5::CTagList *MusicBrainz5::CMetadata::TagList() const
632 {
633 	return m_d->m_TagList;
634 }
635 
UserTagList() const636 MusicBrainz5::CUserTagList *MusicBrainz5::CMetadata::UserTagList() const
637 {
638 	return m_d->m_UserTagList;
639 }
640 
CollectionList() const641 MusicBrainz5::CCollectionList *MusicBrainz5::CMetadata::CollectionList() const
642 {
643 	return m_d->m_CollectionList;
644 }
645 
CDStub() const646 MusicBrainz5::CCDStub *MusicBrainz5::CMetadata::CDStub() const
647 {
648 	return m_d->m_CDStub;
649 }
650 
Message() const651 MusicBrainz5::CMessage *MusicBrainz5::CMetadata::Message() const
652 {
653 	return m_d->m_Message;
654 }
655 
Serialise(std::ostream & os) const656 std::ostream& MusicBrainz5::CMetadata::Serialise(std::ostream& os) const
657 {
658 	os << "Metadata:" << std::endl;
659 
660 	CEntity::Serialise(os);
661 
662 	os << "XMLNS:     " << XMLNS() << std::endl;
663 	os << "XMLNS-Ext: " << XMLNSExt() << std::endl;
664 	os << "Generator: " << Generator() << std::endl;
665 	os << "Created:   " << Created() << std::endl;
666 
667 	if (Artist())
668 		os << *Artist() << std::endl;
669 
670 	if (Release())
671 		os << *Release() << std::endl;
672 
673 	if (ReleaseGroup())
674 		os << *ReleaseGroup() << std::endl;
675 
676 	if (Recording())
677 		os << *Recording() << std::endl;
678 
679 	if (Label())
680 		os << *Label() << std::endl;
681 
682 	if (Work())
683 		os << *Work() << std::endl;
684 
685 	if (PUID())
686 		os << *PUID() << std::endl;
687 
688 	if (ISRC())
689 		os << *ISRC() << std::endl;
690 
691 	if (Disc())
692 		os << *Disc() << std::endl;
693 
694 	if (LabelInfoList())
695 		os << *LabelInfoList() << std::endl;
696 
697 	if (UserRating())
698 		os << *UserRating() << std::endl;
699 
700 	if (Collection())
701 		os << *Collection() << std::endl;
702 
703 	if (ArtistList())
704 		os << *ArtistList() << std::endl;
705 
706 	if (ReleaseList())
707 		os << *ReleaseList() << std::endl;
708 
709 	if (ReleaseGroupList())
710 		os << *ReleaseGroupList() << std::endl;
711 
712 	if (RecordingList())
713 		os << *RecordingList() << std::endl;
714 
715 	if (LabelList())
716 		os << *LabelList() << std::endl;
717 
718 	if (WorkList())
719 		os << *WorkList() << std::endl;
720 
721 	if (ISRCList())
722 		os << *ISRCList() << std::endl;
723 
724 	if (AnnotationList())
725 		os << *AnnotationList() << std::endl;
726 
727 	if (CDStubList())
728 		os << *CDStubList() << std::endl;
729 
730 	if (FreeDBDiscList())
731 		os << *FreeDBDiscList() << std::endl;
732 
733 	if (TagList())
734 		os << *TagList() << std::endl;
735 
736 	if (UserTagList())
737 		os << *UserTagList() << std::endl;
738 
739 	if (CollectionList())
740 		os << *CollectionList() << std::endl;
741 
742 	if (CDStub())
743 		os << *CDStub() << std::endl;
744 
745 	if (Message())
746 		os << *Message() << std::endl;
747 
748 	return os;
749 }
750 
751