init
[open-duckbox-project-sh4:theseus-tdt.git] / tdt / cvs / apps / dvb / libdvbsi++.old / src / content_identifier_descriptor.cpp
1 /*
2  * $Id: content_identifier_descriptor.cpp,v 1.2 2006/03/28 17:22:00 ghostrider Exp $
3  *
4  * Copyright (C) 2005 Marcel Siegert <mws@twisted-brains.org>
5  *
6  * This library is free software; you can redistribute it and/or
7  * modify it under the terms of the GNU Lesser General Public
8  * License version 2.1 as published by the Free Software Foundation.
9  *
10  * See the file 'COPYING' in the top level directory for details.
11  */
12 #include "dvbsi++/content_identifier_descriptor.h"
13
14 #include "dvbsi++/byte_stream.h"
15
16 ContentReferenceIdentifier::ContentReferenceIdentifier(const uint8_t * const buffer)
17 {
18         type = (buffer[0] >> 2) & 0x3f;
19         location = buffer[0] & 0x03;
20
21         if (location == 0) {
22                 length = buffer[1];
23                 cridBytes.reserve(length);
24                 memcpy(&cridBytes[0], buffer+2, length);
25                 reference = 0x0000;
26         } else if (location == 1) {
27                 length = 0;
28                 reference = r16(&buffer[2]);
29         }
30         // else DVB reserved
31 }
32
33 ContentReferenceIdentifier::~ContentReferenceIdentifier()
34 {
35 }
36
37 uint8_t ContentReferenceIdentifier::getType() const
38 {
39         return type;
40 }
41
42 uint8_t ContentReferenceIdentifier::getLocation() const
43 {
44         return location;
45 }
46
47 uint8_t ContentReferenceIdentifier::getLength() const
48 {
49         return length;
50 }
51
52 const ContentReferenceIdentifierByteVector *ContentReferenceIdentifier::getBytes() const
53 {
54         return &cridBytes;
55 }
56
57 uint16_t ContentReferenceIdentifier::getReference() const
58 {
59         return reference;
60 }
61
62
63 ContentIdentifierDescriptor::ContentIdentifierDescriptor(const uint8_t * const buffer) : Descriptor(buffer)
64 {
65         for (size_t i = 0; i < descriptorLength; /* inc inside loop */) {
66                 ContentReferenceIdentifier *crid = new ContentReferenceIdentifier(&buffer[2 + i]);
67
68                 if (crid->getLocation() == 0)
69                         i += crid->getLength() + 2;
70                 else if (crid->getLocation() == 1)
71                         i += 3;
72
73                 identifier.push_back(crid);
74         }
75 }
76
77 ContentIdentifierDescriptor::~ContentIdentifierDescriptor()
78 {
79         for (ContentReferenceIdentifierIterator it = identifier.begin(); it != identifier.end(); ++it)
80                 delete *it;
81 }
82
83 const ContentReferenceIdentifierList *ContentIdentifierDescriptor::getIdentifier() const
84 {
85         return &identifier;
86 }