1 : //==============================================================================
2 : // File <$/src/cpp/prod/protocol/giop/target_address.cpp>
3 : // This file is part of YaOrb : Yet Another Object Request Broker,
4 : // Copyright (c) 2000-2003, Marc Alff.
5 : //
6 : // This program is free software; you can redistribute it and/or
7 : // modify it under the terms of the GNU General Public License
8 : // as published by the Free Software Foundation; either version 2
9 : // of the License, or (at your option) any later version.
10 : //
11 : // This program is distributed in the hope that it will be useful,
12 : // but WITHOUT ANY WARRANTY; without even the implied warranty of
13 : // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 : // GNU General Public License for more details.
15 : //
16 : // You should have received a copy of the GNU General Public License
17 : // along with this program; if not, write to the Free Software
18 : // Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
19 : //
20 : //==============================================================================
21 :
22 : #include <yaorb/CORBA.h>
23 : #include <yaorb/YAORB.h>
24 :
25 : #include "src/cpp/prod/tool/DEVELOPMENT.h"
26 : #include "src/cpp/prod/tool/Assert.h"
27 : #include "src/cpp/prod/protocol/cdr/msg.h"
28 : #include "src/cpp/prod/protocol/giop/target_address.h"
29 :
30 : //==============================================================================
31 : // Implementation of IOPAddressingInfo
32 : //==============================================================================
33 :
34 1 : IORAddressingInfo::IORAddressingInfo()
35 : : _selected_profile_index(0),
36 1 : _ior()
37 : {
38 : }
39 :
40 : IORAddressingInfo::IORAddressingInfo(
41 0 : const IORAddressingInfo& ai)
42 : : _selected_profile_index(ai._selected_profile_index),
43 0 : _ior(ai._ior)
44 : {
45 : }
46 :
47 : IORAddressingInfo&
48 : IORAddressingInfo::operator=(
49 0 : const IORAddressingInfo& ai)
50 : {
51 0 : _selected_profile_index = ai._selected_profile_index ;
52 0 : _ior = ai._ior ;
53 :
54 : return *this ;
55 : }
56 :
57 1 : IORAddressingInfo::~IORAddressingInfo()
58 : {
59 1 : }
60 :
61 1 : void IORAddressingInfo::cdr(YAORB::CDR* cdrs)
62 : {
63 1 : cdrs->cdr_ULong(& _selected_profile_index) ;
64 1 : _ior.cdr(cdrs) ;
65 : }
66 :
67 : //==============================================================================
68 : // Implementation of TargetAddress
69 : //==============================================================================
70 :
71 7 : TargetAddress::TargetAddress()
72 : : _discriminant(-1),
73 7 : _values()
74 : {}
75 :
76 : TargetAddress::TargetAddress(
77 4 : GIOPEncapsulation* object_key)
78 : : _discriminant(KeyAddr),
79 4 : _values()
80 : {
81 4 : _values._object_key = object_key ;
82 : }
83 :
84 : TargetAddress::TargetAddress(
85 0 : IOP::TaggedProfile* profile)
86 : : _discriminant(ProfileAddr),
87 0 : _values()
88 : {
89 0 : _values._profile = profile ;
90 : }
91 :
92 : TargetAddress::TargetAddress(
93 0 : IORAddressingInfo* ior)
94 : : _discriminant(ReferenceAddr),
95 0 : _values()
96 : {
97 0 : _values._ior = ior ;
98 : }
99 :
100 : TargetAddress::TargetAddress(
101 4 : const TargetAddress& ta)
102 : : _discriminant(ta._discriminant),
103 4 : _values()
104 : {
105 4 : switch (_discriminant)
106 : {
107 : case KeyAddr:
108 : {
109 4 : const GIOPEncapsulation * src = ta._values._object_key ;
110 : ASSERT(src != NULL) ;
111 4 : _values._object_key = new GIOPEncapsulation(*src) ;
112 4 : break ;
113 : }
114 : case ProfileAddr:
115 : {
116 0 : const IOP::TaggedProfile *src = ta._values._profile ;
117 : ASSERT(src != NULL) ;
118 0 : _values._profile = new IOP::TaggedProfile(*src) ;
119 0 : break ;
120 : }
121 : case ReferenceAddr:
122 : {
123 0 : const IORAddressingInfo *src = ta._values._ior ;
124 : ASSERT(src != NULL) ;
125 0 : _values._ior = new IORAddressingInfo (*src) ;
126 : break ;
127 : }
128 : }
129 : }
130 :
131 : TargetAddress&
132 : TargetAddress::operator=(
133 0 : const TargetAddress& ta)
134 : {
135 0 : NON_DEV("TargetAddress::op=") ;
136 :
137 : return *this ;
138 : }
139 :
140 11 : TargetAddress::~TargetAddress()
141 : {
142 11 : switch (_discriminant)
143 : {
144 : case KeyAddr:
145 : {
146 8 : delete _values._object_key ;
147 : break ;
148 : }
149 : case ProfileAddr:
150 : {
151 1 : delete _values._profile ;
152 : break ;
153 : }
154 : case ReferenceAddr:
155 : {
156 1 : delete _values._ior ;
157 : break ;
158 : }
159 : }
160 1 : }
161 :
162 11 : void TargetAddress::cdr(YAORB::CDR* cdrs)
163 : {
164 11 : cdrs->cdr_Short(& _discriminant) ;
165 11 : YAORB::CDR_Op op = cdrs->Op() ;
166 :
167 11 : switch (_discriminant)
168 : {
169 : case KeyAddr:
170 : {
171 8 : if (op == YAORB::CDR_READ)
172 : {
173 4 : _values._object_key = new GIOPEncapsulation() ;
174 : }
175 8 : _values._object_key->cdr(cdrs) ;
176 : break ;
177 : }
178 : case ProfileAddr:
179 : {
180 1 : if (op == YAORB::CDR_READ)
181 : {
182 1 : _values._profile = new IOP::TaggedProfile() ;
183 : }
184 1 : _values._profile->cdr(cdrs) ;
185 : break ;
186 : }
187 : case ReferenceAddr:
188 : {
189 1 : if (op == YAORB::CDR_READ)
190 : {
191 1 : _values._ior = new IORAddressingInfo() ;
192 : }
193 1 : _values._ior->cdr(cdrs) ;
194 : break ;
195 : }
196 : default:
197 : {
198 1 : ThrowMarshal(cdrs) ;
199 : }
200 : }
201 : }
202 :
203 : AddressingDisposition
204 6 : TargetAddress::GetAddressingDisposition(void) const
205 : {
206 : return _discriminant ;
207 : }
208 :
209 : GIOPEncapsulation*
210 4 : TargetAddress::GetObjectKey(void) const
211 : {
212 : ASSERT(_discriminant == KeyAddr) ;
213 : return _values._object_key ;
214 : }
215 :
216 : IOP::TaggedProfile*
217 1 : TargetAddress::GetProfile(void) const
218 : {
219 : ASSERT(_discriminant == ProfileAddr) ;
220 : return _values._profile ;
221 : }
222 :
223 : IORAddressingInfo*
224 1 : TargetAddress::GetIOR(void) const
225 : {
226 : ASSERT(_discriminant == ReferenceAddr) ;
227 : return _values._ior ;
228 : }
229 :
|