1 //////////////////////////////////////////////////////////////////
6 // Define template classes that associate RAS tags and types
8 // Copyright (c) Citron Network Inc. 2003
10 // This work is published under the GNU Public License (GPL)
11 // see file COPYING for details.
12 // We also explicitely grant the right to link this code
13 // with the OpenH323 library.
15 // initial author: Chih-Wei Huang <cwhuang@linux.org.tw>
16 // initial version: 05/28/2003
18 //////////////////////////////////////////////////////////////////
21 #define RASINFO_H "@(#) $Id: rasinfo.h,v 1.3 2006/04/14 13:56:19 willamowius Exp $"
23 #ifndef __STL_TEMPLATE_NULL
24 // explicit specialization
25 #define __STL_TEMPLATE_NULL template<>
28 #ifndef __explicit_specialization
29 #define __explicit_specialization __STL_TEMPLATE_NULL
32 // compile time assertion
33 template<bool> struct CTAssert;
34 template<> struct CTAssert<true> {};
36 // define a type for an RAS tag
37 template<int I> struct RasTag {
38 operator unsigned() const { return I; }
41 // the template classes map RAS tags to its corresponding RAS types
42 template<int> struct RasType;
44 template<> struct RasType<H225_RasMessage::e_gatekeeperRequest> {
45 typedef H225_GatekeeperRequest Type;
47 template<> struct RasType<H225_RasMessage::e_gatekeeperConfirm> {
48 typedef H225_GatekeeperConfirm Type;
50 template<> struct RasType<H225_RasMessage::e_gatekeeperReject> {
51 typedef H225_GatekeeperReject Type;
53 template<> struct RasType<H225_RasMessage::e_registrationRequest> {
54 typedef H225_RegistrationRequest Type;
56 template<> struct RasType<H225_RasMessage::e_registrationConfirm> {
57 typedef H225_RegistrationConfirm Type;
59 template<> struct RasType<H225_RasMessage::e_registrationReject> {
60 typedef H225_RegistrationReject Type;
62 template<> struct RasType<H225_RasMessage::e_unregistrationRequest> {
63 typedef H225_UnregistrationRequest Type;
65 template<> struct RasType<H225_RasMessage::e_unregistrationConfirm> {
66 typedef H225_UnregistrationConfirm Type;
68 template<> struct RasType<H225_RasMessage::e_unregistrationReject> {
69 typedef H225_UnregistrationReject Type;
71 template<> struct RasType<H225_RasMessage::e_admissionRequest> {
72 typedef H225_AdmissionRequest Type;
74 template<> struct RasType<H225_RasMessage::e_admissionConfirm> {
75 typedef H225_AdmissionConfirm Type;
77 template<> struct RasType<H225_RasMessage::e_admissionReject> {
78 typedef H225_AdmissionReject Type;
80 template<> struct RasType<H225_RasMessage::e_bandwidthRequest> {
81 typedef H225_BandwidthRequest Type;
83 template<> struct RasType<H225_RasMessage::e_bandwidthConfirm> {
84 typedef H225_BandwidthConfirm Type;
86 template<> struct RasType<H225_RasMessage::e_bandwidthReject> {
87 typedef H225_BandwidthReject Type;
89 template<> struct RasType<H225_RasMessage::e_disengageRequest> {
90 typedef H225_DisengageRequest Type;
92 template<> struct RasType<H225_RasMessage::e_disengageConfirm> {
93 typedef H225_DisengageConfirm Type;
95 template<> struct RasType<H225_RasMessage::e_disengageReject> {
96 typedef H225_DisengageReject Type;
98 template<> struct RasType<H225_RasMessage::e_locationRequest> {
99 typedef H225_LocationRequest Type;
101 template<> struct RasType<H225_RasMessage::e_locationConfirm> {
102 typedef H225_LocationConfirm Type;
104 template<> struct RasType<H225_RasMessage::e_locationReject> {
105 typedef H225_LocationReject Type;
107 template<> struct RasType<H225_RasMessage::e_infoRequest> {
108 typedef H225_InfoRequest Type;
110 template<> struct RasType<H225_RasMessage::e_infoRequestResponse> {
111 typedef H225_InfoRequestResponse Type;
113 template<> struct RasType<H225_RasMessage::e_nonStandardMessage> {
114 typedef H225_NonStandardMessage Type;
116 template<> struct RasType<H225_RasMessage::e_unknownMessageResponse> {
117 typedef H225_UnknownMessageResponse Type;
119 template<> struct RasType<H225_RasMessage::e_requestInProgress> {
120 typedef H225_RequestInProgress Type;
122 template<> struct RasType<H225_RasMessage::e_resourcesAvailableIndicate> {
123 typedef H225_ResourcesAvailableIndicate Type;
125 template<> struct RasType<H225_RasMessage::e_resourcesAvailableConfirm> {
126 typedef H225_ResourcesAvailableConfirm Type;
128 template<> struct RasType<H225_RasMessage::e_infoRequestAck> {
129 typedef H225_InfoRequestAck Type;
131 template<> struct RasType<H225_RasMessage::e_infoRequestNak> {
132 typedef H225_InfoRequestNak Type;
134 template<> struct RasType<H225_RasMessage::e_serviceControlIndication> {
135 typedef H225_ServiceControlIndication Type;
137 template<> struct RasType<H225_RasMessage::e_serviceControlResponse> {
138 typedef H225_ServiceControlResponse Type;
141 // associate a tag and its type
142 template<int I> struct TagInfo {
143 typedef RasTag<I> Tag;
144 typedef typename RasType<I>::Type Type;
147 // there are just 32 types of RAS, lucky!
152 // a dirty trick, but works :p
153 template<int I> struct RequestInfo : public TagInfo<I> {
154 typedef RasTag<I+1> ConfirmTag;
155 typedef RasTag<I+2> RejectTag;
156 typedef typename RasType<I+1>::Type ConfirmType;
157 typedef typename RasType<I+2>::Type RejectType;
160 template<int I> struct ConfirmInfo : public TagInfo<I> {
161 typedef RasTag<I-1> RequestTag;
162 typedef typename RasType<I-1>::Type RequestType;
165 template<int I> struct RejectInfo : public TagInfo<I> {
166 typedef RasTag<I-2> RequestTag;
167 typedef typename RasType<I-2>::Type RequestType;
170 // define an RAS request and all its associated types
171 template<class> struct RasInfo;
174 template<> struct RasInfo<H225_GatekeeperRequest> : public RequestInfo<H225_RasMessage::e_gatekeeperRequest> {};
175 template<> struct RasInfo<H225_RegistrationRequest> : public RequestInfo<H225_RasMessage::e_registrationRequest> {};
176 template<> struct RasInfo<H225_UnregistrationRequest> : public RequestInfo<H225_RasMessage::e_unregistrationRequest> {};
177 template<> struct RasInfo<H225_AdmissionRequest> : public RequestInfo<H225_RasMessage::e_admissionRequest> {};
178 template<> struct RasInfo<H225_BandwidthRequest> : public RequestInfo<H225_RasMessage::e_bandwidthRequest> {};
179 template<> struct RasInfo<H225_DisengageRequest> : public RequestInfo<H225_RasMessage::e_disengageRequest> {};
180 template<> struct RasInfo<H225_LocationRequest> : public RequestInfo<H225_RasMessage::e_locationRequest> {};
183 template<> struct RasInfo<H225_GatekeeperConfirm> : public ConfirmInfo<H225_RasMessage::e_gatekeeperConfirm> {};
184 template<> struct RasInfo<H225_RegistrationConfirm> : public ConfirmInfo<H225_RasMessage::e_registrationConfirm> {};
185 template<> struct RasInfo<H225_UnregistrationConfirm> : public ConfirmInfo<H225_RasMessage::e_unregistrationConfirm> {};
186 template<> struct RasInfo<H225_AdmissionConfirm> : public ConfirmInfo<H225_RasMessage::e_admissionConfirm> {};
187 template<> struct RasInfo<H225_BandwidthConfirm> : public ConfirmInfo<H225_RasMessage::e_bandwidthConfirm> {};
188 template<> struct RasInfo<H225_DisengageConfirm> : public ConfirmInfo<H225_RasMessage::e_disengageConfirm> {};
189 template<> struct RasInfo<H225_LocationConfirm> : public ConfirmInfo<H225_RasMessage::e_locationConfirm> {};
192 template<> struct RasInfo<H225_GatekeeperReject> : public RejectInfo<H225_RasMessage::e_gatekeeperReject> {};
193 template<> struct RasInfo<H225_RegistrationReject> : public RejectInfo<H225_RasMessage::e_registrationReject> {};
194 template<> struct RasInfo<H225_UnregistrationReject> : public RejectInfo<H225_RasMessage::e_unregistrationReject> {};
195 template<> struct RasInfo<H225_AdmissionReject> : public RejectInfo<H225_RasMessage::e_admissionReject> {};
196 template<> struct RasInfo<H225_BandwidthReject> : public RejectInfo<H225_RasMessage::e_bandwidthReject> {};
197 template<> struct RasInfo<H225_DisengageReject> : public RejectInfo<H225_RasMessage::e_disengageReject> {};
198 template<> struct RasInfo<H225_LocationReject> : public RejectInfo<H225_RasMessage::e_locationReject> {};
201 template<> struct RasInfo<H225_InfoRequest> : public TagInfo<H225_RasMessage::e_infoRequest> {};
202 template<> struct RasInfo<H225_InfoRequestResponse> : public TagInfo<H225_RasMessage::e_infoRequestResponse> {
203 typedef RasTag<tag+6> ConfirmTag;
204 typedef RasTag<tag+7> RejectTag;
205 typedef RasType<tag+6>::Type ConfirmType;
206 typedef RasType<tag+7>::Type RejectType;
208 template<> struct RasInfo<H225_NonStandardMessage> : public TagInfo<H225_RasMessage::e_nonStandardMessage> {};
209 template<> struct RasInfo<H225_UnknownMessageResponse> : public TagInfo<H225_RasMessage::e_unknownMessageResponse> {};
210 template<> struct RasInfo<H225_RequestInProgress> : public TagInfo<H225_RasMessage::e_requestInProgress> {};
211 template<> struct RasInfo<H225_ResourcesAvailableIndicate> : public TagInfo<H225_RasMessage::e_resourcesAvailableIndicate> {
212 typedef RasTag<tag+1> ConfirmTag;
213 typedef RasType<tag+1>::Type ConfirmType;
215 template<> struct RasInfo<H225_ResourcesAvailableConfirm> : public TagInfo<H225_RasMessage::e_resourcesAvailableConfirm> {};
216 template<> struct RasInfo<H225_InfoRequestAck> : public TagInfo<H225_RasMessage::e_infoRequestAck> {};
217 template<> struct RasInfo<H225_InfoRequestNak> : public TagInfo<H225_RasMessage::e_infoRequestNak> {};
218 template<> struct RasInfo<H225_ServiceControlIndication> : public TagInfo<H225_RasMessage::e_serviceControlIndication> {};
219 template<> struct RasInfo<H225_ServiceControlResponse> : public TagInfo<H225_RasMessage::e_serviceControlResponse> {};