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