View Javadoc

1   /***
2    * Java DAB EPG API - Serialize/Deserialize To/From POJOs to XML/Binary as per
3    * ETSI specifications TS 102 818 (XML Specification for DAB EPG) and TS 102 
4    * 371 (Transportation and Binary Encoding Specification for EPG).
5    * 
6    * Copyright (C) 2007 GCap Media PLC
7    *
8    * This library is free software; you can redistribute it and/or
9    * modify it under the terms of the GNU Lesser General Public
10   * License as published by the Free Software Foundation; either
11   * version 2.1 of the License, or (at your option) any later version.
12   *
13   * This library is distributed in the hope that it will be useful,
14   * but WITHOUT ANY WARRANTY; without even the implied warranty of
15   * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
16   * Lesser General Public License for more details.
17   *
18   * You should have received a copy of the GNU Lesser General Public
19   * License along with this library; if not, write to the Free Software
20   * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
21   */
22  package com.gcapmedia.dab.epg.binary;
23  
24  
25  /***
26   * List all defined tag types as per ETSI TS 101 371 V1.2.1 (2006-02)
27   */
28  public enum AttributeTag implements Encodable {
29  
30  	/***
31  	 * Top level tags
32  	 */
33  	epgSystem(ElementTag.epg, 0x80),
34  	
35  	programmeGroupsVersion(ElementTag.programmeGroups, 0x80),
36  	programmeGroupsCreationTime(ElementTag.programmeGroups, 0x81),
37  	programmeGroupsOriginator(ElementTag.programmeGroups, 0x82),
38  	
39  	programmeGroupId(ElementTag.programmeGroup, 0x80),
40  	programmeGroupShortId(ElementTag.programmeGroup, 0x81),
41  	programmeGroupVersion(ElementTag.programmeGroup, 0x82),
42  	programmeGroupType(ElementTag.programmeGroup, 0x83),
43  	programmeGroupNumOfItems(ElementTag.programmeGroup, 0x84),
44  	
45  	scheduleVersion(ElementTag.schedule, 0x80),
46  	scheduleCreationTime(ElementTag.schedule, 0x81),
47  	scheduleOriginator(ElementTag.schedule, 0x82),
48  	
49  	scopeStartTime(ElementTag.scope, 0x80),
50  	scopeStopTime(ElementTag.scope, 0x81),
51  	
52  	serviceScopeId(ElementTag.serviceScope, 0x80),
53  	
54  	alternateSourceProtocol(ElementTag.alternateSource, 0x80),
55  	alternateSourceType(ElementTag.alternateSource, 0x81),
56  	alternateSourceUrl(ElementTag.alternateSource, 0x82),
57  	
58  	serviceInformationVersion(ElementTag.serviceInformation, 0x80),
59  	serviceInformationCreationTime(ElementTag.serviceInformation, 0x81),
60  	serviceInformationOriginator(ElementTag.serviceInformation, 0x82),
61  	serviceInformationServiceProvider(ElementTag.serviceInformation, 0x83),
62  	serviceInformationSystem(ElementTag.serviceInformation, 0x84),
63  	
64  	ensembleId(ElementTag.ensemble, 0x80),
65  	ensembleVersion(ElementTag.ensemble, 0x81),
66  	
67  	frequencyType(ElementTag.frequency, 0x80),
68  	frequencyKHz(ElementTag.frequency, 0x81),
69  	
70  	serviceVersion(ElementTag.service, 0x80),
71  	serviceFormat(ElementTag.service, 0x81),
72  	serviceBitrate(ElementTag.service, 0x83),
73  	
74  	simulcastSystem(ElementTag.simulcast, 0x80),
75  	simulcastId(ElementTag.simulcast, 0x81),
76  	
77  	serviceIdId(ElementTag.serviceID, 0x80),
78  	serviceIdType(ElementTag.serviceID, 0x81),
79  	
80  	CAType(ElementTag.CA, 0x80),
81  	
82  	keywordsLang(ElementTag.keywords, 0x80),
83  	
84  	multimediaMimeValue(ElementTag.multimedia, 0x80),
85  	multimediaLan(ElementTag.multimedia, 0x81),
86  	multimediaUrl(ElementTag.multimedia, 0x82),
87  	multimediaType(ElementTag.multimedia, 0x83),
88  	multimediaWidth(ElementTag.multimedia, 0x84),
89  	multimediaHeight(ElementTag.multimedia, 0x85),
90  	
91  	timeTime(ElementTag.time, 0x80),
92  	timeDuration(ElementTag.time, 0x81),
93  	timeActualTime(ElementTag.time, 0x82),
94  	timeActualDuration(ElementTag.time, 0x83),
95  	
96  	relativeTimeTime(ElementTag.relativeTime, 0x80),
97  	relativeTimeDuration(ElementTag.relativeTime, 0x81),
98  	relativeTimeActualTime(ElementTag.relativeTime, 0x82),
99  	relativeTimeActualDuration(ElementTag.relativeTime, 0x83),
100 	
101 	bearerId(ElementTag.bearer, 0x80),
102 	bearerTrigger(ElementTag.bearer, 0x81),
103 	
104 	memberOfId(ElementTag.memberOf, 0x80),
105 	memberOfShortId(ElementTag.memberOf, 0x81),
106 	memberOfIndex(ElementTag.memberOf, 0x82),
107 	
108 	epgLanguageLang(ElementTag.epgLanguage, 0x80),
109 	
110 	linkUrl(ElementTag.link, 0x80),
111 	linkMimeValue(ElementTag.link, 0x81),
112 	linkLang(ElementTag.link, 0x82),
113 	linkDescription(ElementTag.link, 0x83),
114 	linkExpiryTime(ElementTag.link, 0x84),
115 	
116 	programmeId(ElementTag.programme, 0x80),
117 	programmeShortId(ElementTag.programme, 0x81),
118 	programmeVersion(ElementTag.programme, 0x82),
119 	programmeRecommendation(ElementTag.programme, 0x83),
120 	programmeBroadcast(ElementTag.programme, 0x84),
121 	programmeLang(ElementTag.programme, 0x86),
122 	programmeBitRate(ElementTag.programme, 0x87),
123 	
124 	programmeEventId(ElementTag.programmeEvent, 0x80),
125 	programmeEventShortId(ElementTag.programmeEvent, 0x81),
126 	programmeEventVersion(ElementTag.programmeEvent, 0x82),
127 	programmeEventRecommendation(ElementTag.programmeEvent, 0x83),
128 	programmeEventBroadcast(ElementTag.programmeEvent, 0x84),
129 	
130 	shortNameLang(ElementTag.shortName, 0x80),
131 	
132 	mediumNameLang(ElementTag.mediumName, 0x80),
133 	
134 	longNameLang(ElementTag.longName, 0x80),
135 	
136 	shortDescriptionLang(ElementTag.shortDescription, 0x80),
137 	
138 	longDescriptionLang(ElementTag.longDescription, 0x80),
139 	
140 	genreHref(ElementTag.genre, 0x80),
141 	genreType(ElementTag.genre, 0x81);	
142 	
143 	/***
144 	 * Parent element tag - this is needed to be able
145 	 * to parse an attribute tag successfully.
146 	 */
147 	private ElementTag parent;
148 	
149 	/***
150 	 * Attribute tag value
151 	 */
152 	private byte value;
153 	
154 	/***
155 	 * 
156 	 * @param value
157 	 */
158 	AttributeTag(ElementTag parent, int value) {
159 		this.parent = parent;
160 		this.value = (byte)value;
161 	}
162 	
163 	/***
164 	 * @see com.gcapmedia.dab.epg.binary.Encodable#getBytes()
165 	 */
166 	public byte[] getBytes() {
167 		BitBuilder bits = new BitBuilder(8);
168 		bits.put(0, value);
169 		return bits.toByteArray();
170 	}
171 	
172 	/***
173 	 * @return Returns the tags parent element tag
174 	 */
175 	public ElementTag getParent() {
176 		return parent;
177 	}
178 	
179 	/***
180 	 * @return Returns the tag value
181 	 */
182 	public int getValue() {
183 		return value & 0xFF;
184 	}
185 
186 	/***
187 	 * @see com.gcapmedia.dab.epg.binary.Encodable#getLength()
188 	 */
189 	public int getLength() {
190 		return 1;
191 	}
192 	
193 	/***
194 	 * Parse an object from its byte array representation
195 	 * @param parent Tag parent
196 	 * @param bytes Byte array representation
197 	 */
198 	public static AttributeTag fromBytes(ElementTag parent, byte[] bytes) {
199 		BitParser parser = new BitParser(bytes);
200 		int value = parser.getInt(0, 8);
201 		AttributeTag result = null;
202 		for(AttributeTag tag : values()) {
203 			if(tag.parent == parent && tag.getValue() == value) {
204 				result = tag;
205 				break;
206 			}
207 		}
208 		if(result == null) {
209 			throw new IllegalArgumentException("Tag not found for value: 0x" + Integer.toHexString(value) + " from parent: " + parent);
210 		}
211 		return result;
212 	}
213 	
214 }