1 karl 1.42 //%2005////////////////////////////////////////////////////////////////////////
|
2 mike 1.13 //
|
3 karl 1.40 // Copyright (c) 2000, 2001, 2002 BMC Software; Hewlett-Packard Development
4 // Company, L.P.; IBM Corp.; The Open Group; Tivoli Systems.
5 // Copyright (c) 2003 BMC Software; Hewlett-Packard Development Company, L.P.;
|
6 karl 1.39 // IBM Corp.; EMC Corporation, The Open Group.
|
7 karl 1.40 // Copyright (c) 2004 BMC Software; Hewlett-Packard Development Company, L.P.;
8 // IBM Corp.; EMC Corporation; VERITAS Software Corporation; The Open Group.
|
9 karl 1.42 // Copyright (c) 2005 Hewlett-Packard Development Company, L.P.; IBM Corp.;
10 // EMC Corporation; VERITAS Software Corporation; The Open Group.
|
11 mike 1.13 //
12 // Permission is hereby granted, free of charge, to any person obtaining a copy
|
13 kumpf 1.24 // of this software and associated documentation files (the "Software"), to
14 // deal in the Software without restriction, including without limitation the
15 // rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
|
16 mike 1.13 // sell copies of the Software, and to permit persons to whom the Software is
17 // furnished to do so, subject to the following conditions:
|
18 chip 1.44 //
|
19 kumpf 1.24 // THE ABOVE COPYRIGHT NOTICE AND THIS PERMISSION NOTICE SHALL BE INCLUDED IN
|
20 mike 1.13 // ALL COPIES OR SUBSTANTIAL PORTIONS OF THE SOFTWARE. THE SOFTWARE IS PROVIDED
21 // "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT
|
22 kumpf 1.24 // LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR
23 // PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
24 // HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
|
25 mike 1.13 // ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
26 // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
27 //
28 //==============================================================================
29 //
30 // Author: Mike Brasher (mbrasher@bmc.com)
31 //
|
32 kumpf 1.27 // Modified By: Carol Ann Krug Graves, Hewlett-Packard Company
|
33 david.dillard 1.41 // (carolann_graves@hp.com)
34 // David Dillard, VERITAS Software Corp.
35 // (david.dillard@veritas.com)
|
36 mike 1.13 //
37 //%/////////////////////////////////////////////////////////////////////////////
38
|
39 sage 1.15 #include <Pegasus/Common/Config.h>
|
40 mike 1.13 #include "CIMMethod.h"
|
41 kumpf 1.18 #include "CIMMethodRep.h"
|
42 kumpf 1.27 #include "Resolver.h"
|
43 mike 1.13 #include "Indentor.h"
44 #include "CIMName.h"
45 #include "CIMScope.h"
46 #include "XmlWriter.h"
|
47 kumpf 1.23 #include "MofWriter.h"
|
48 humberto 1.38 #include <Pegasus/Common/MessageLoader.h> //l10n
|
49 mike 1.13
50 PEGASUS_NAMESPACE_BEGIN
51
|
52 chip 1.44 CIMMethodRep::CIMMethodRep()
53 {
54 }
55
56 CIMMethodRep::CIMMethodRep(const CIMMethodRep& x) :
57 Sharable(),
58 _name(x._name),
59 _type(x._type),
60 _classOrigin(x._classOrigin),
61 _propagated(x._propagated)
62 {
63 x._qualifiers.cloneTo(_qualifiers);
64
65 _parameters.reserveCapacity(x._parameters.size());
66
67 for (Uint32 i = 0, n = x._parameters.size(); i < n; i++)
68 {
69 _parameters.append(x._parameters[i].clone());
70 }
71 }
72
|
73 mike 1.13 CIMMethodRep::CIMMethodRep(
|
74 kumpf 1.29 const CIMName& name,
|
75 mike 1.13 CIMType type,
|
76 kumpf 1.29 const CIMName& classOrigin,
|
77 mike 1.13 Boolean propagated)
78 : _name(name), _type(type),
79 _classOrigin(classOrigin), _propagated(propagated)
80 {
|
81 chip 1.44 // ensure name is not null
82 if(name.isNull())
83 {
84 throw UninitializedObjectException();
85 }
|
86 mike 1.13 }
87
88 CIMMethodRep::~CIMMethodRep()
89 {
90 }
91
|
92 kumpf 1.29 void CIMMethodRep::setName(const CIMName& name)
|
93 mike 1.13 {
|
94 chip 1.44 // ensure name is not null
95 if(name.isNull())
96 {
97 throw UninitializedObjectException();
98 }
99
|
100 mike 1.13 _name = name;
101 }
102
|
103 kumpf 1.29 void CIMMethodRep::setClassOrigin(const CIMName& classOrigin)
|
104 mike 1.13 {
105 _classOrigin = classOrigin;
106 }
107
108 void CIMMethodRep::addParameter(const CIMParameter& x)
109 {
|
110 kumpf 1.31 if (x.isUninitialized())
|
111 david.dillard 1.43 throw UninitializedObjectException();
|
112 mike 1.13
|
113 humberto 1.38 if (findParameter(x.getName()) != PEG_NOT_FOUND){
|
114 david.dillard 1.43 //l10n
115 //throw AlreadyExistsException
|
116 humberto 1.38 //("parameter \"" + x.getName().getString () + "\"");
117 MessageLoaderParms parms("Common.CIMMethodRep.PARAMETER",
|
118 david.dillard 1.43 "parameter \"$0\"",
119 x.getName().getString());
|
120 humberto 1.38 throw AlreadyExistsException(parms);
121 }
|
122 mike 1.13
123 _parameters.append(x);
124 }
125
|
126 kumpf 1.29 Uint32 CIMMethodRep::findParameter(const CIMName& name) const
|
127 mike 1.13 {
128 for (Uint32 i = 0, n = _parameters.size(); i < n; i++)
129 {
|
130 david.dillard 1.43 if (name.equal(_parameters[i].getName()))
131 return i;
|
132 mike 1.13 }
133
134 return PEG_NOT_FOUND;
135 }
136
|
137 kumpf 1.36 CIMParameter CIMMethodRep::getParameter(Uint32 index)
|
138 mike 1.13 {
|
139 kumpf 1.36 if (index >= _parameters.size())
|
140 david.dillard 1.43 throw IndexOutOfBoundsException();
|
141 mike 1.13
|
142 kumpf 1.36 return _parameters[index];
|
143 mike 1.13 }
144
|
145 kumpf 1.36 void CIMMethodRep::removeParameter(Uint32 index)
|
146 kumpf 1.32 {
|
147 kumpf 1.36 if (index >= _parameters.size())
|
148 david.dillard 1.43 throw IndexOutOfBoundsException();
|
149 kumpf 1.32
|
150 kumpf 1.36 _parameters.remove (index);
|
151 kumpf 1.32 }
152
|
153 mike 1.13 Uint32 CIMMethodRep::getParameterCount() const
154 {
155 return _parameters.size();
156 }
157
158 void CIMMethodRep::resolve(
159 DeclContext* declContext,
|
160 kumpf 1.29 const CIMNamespaceName& nameSpace,
|
161 mike 1.13 const CIMConstMethod& inheritedMethod)
162 {
163 // ATTN: Check to see if this method has same signature as
164 // inherited one.
165
166 // Check for type mismatch between return types.
167
|
168 kumpf 1.31 PEGASUS_ASSERT(!inheritedMethod.isUninitialized());
|
169 mike 1.13
170 // Validate the qualifiers of the method (according to
171 // superClass's method with the same name). This method
172 // will throw an exception if the validation fails.
173
174 _qualifiers.resolve(
|
175 david.dillard 1.43 declContext,
176 nameSpace,
177 CIMScope::METHOD,
178 false,
179 inheritedMethod._rep->_qualifiers,
180 true);
|
181 mike 1.13
182 // Validate each of the parameters:
183
|
184 david.dillard 1.43 for (Uint32 i = 0; i < _parameters.size(); i++)
185 Resolver::resolveParameter (_parameters[i], declContext, nameSpace);
|
186 mike 1.13
187 _classOrigin = inheritedMethod.getClassOrigin();
188 }
189
190 void CIMMethodRep::resolve(
191 DeclContext* declContext,
|
192 kumpf 1.29 const CIMNamespaceName& nameSpace)
|
193 mike 1.13 {
194 // Validate the qualifiers:
195
196 CIMQualifierList dummy;
197
198 _qualifiers.resolve(
|
199 david.dillard 1.43 declContext,
200 nameSpace,
201 CIMScope::METHOD,
202 false,
203 dummy,
204 true);
|
205 mike 1.13
206 // Validate each of the parameters:
207
|
208 david.dillard 1.43 for (Uint32 i = 0; i < _parameters.size(); i++)
209 Resolver::resolveParameter (_parameters[i], declContext, nameSpace);
|
210 mike 1.13 }
211
212 static const char* _toString(Boolean x)
213 {
214 return x ? "true" : "false";
215 }
216
|
217 david.dillard 1.41 void CIMMethodRep::toXml(Array<char>& out) const
|
218 mike 1.13 {
219 out << "<METHOD";
220
221 out << " NAME=\"" << _name << "\"";
222
|
223 kumpf 1.28 out << " TYPE=\"" << cimTypeToString (_type) << "\"";
|
224 mike 1.13
|
225 kumpf 1.29 if (!_classOrigin.isNull())
|
226 david.dillard 1.43 out << " CLASSORIGIN=\"" << _classOrigin << "\"";
|
227 mike 1.13
228 if (_propagated != false)
|
229 david.dillard 1.43 out << " PROPAGATED=\"" << _toString(_propagated) << "\"";
|
230 mike 1.13
231 out << ">\n";
232
233 _qualifiers.toXml(out);
234
235 for (Uint32 i = 0, n = _parameters.size(); i < n; i++)
|
236 david.dillard 1.43 XmlWriter::appendParameterElement(out, _parameters[i]);
|
237 mike 1.13
238 out << "</METHOD>\n";
239 }
240
|
241 mike 1.14 /**
242 The BNF for this is;
|
243 david.dillard 1.43 methodDeclaration = [ qualifierList ] dataType methodName
244 "(" [ parameterList ] ")" ";"
|
245 mike 1.14
|
246 david.dillard 1.43 parameterList = parameter *( "," parameter )
|
247 mike 1.14 Format with qualifiers on one line and declaration on another. Start
248 with newline but none at the end.
249 */
|
250 david.dillard 1.41 void CIMMethodRep::toMof(Array<char>& out) const //ATTNKS:
|
251 mike 1.14 {
252 // Output the qualifier list starting on new line
253 if (_qualifiers.getCount())
|
254 david.dillard 1.43 out << "\n";
|
255 mike 1.14
256 _qualifiers.toMof(out);
257
|
258 david.dillard 1.43 // output the type, MethodName and ParmeterList left enclosure
|
259 kumpf 1.28 out << "\n" << cimTypeToString (_type) << " " << _name << "(";
|
260 mike 1.14
261 // output the param list separated by commas.
|
262 chip 1.44
|
263 mike 1.14 for (Uint32 i = 0, n = _parameters.size(); i < n; i++)
264 {
|
265 david.dillard 1.43 // If not first, output comma separator
266 if (i)
267 out << ", ";
|
268 mike 1.14
|
269 david.dillard 1.43 MofWriter::appendParameterElement(out, _parameters[i]);
|
270 mike 1.14 }
271
272 // output the parameterlist and method terminator
273 out << ");";
274 }
275
276
|
277 mike 1.13 Boolean CIMMethodRep::identical(const CIMMethodRep* x) const
278 {
|
279 kumpf 1.37 if (!_name.equal (x->_name))
|
280 david.dillard 1.43 return false;
|
281 mike 1.13
282 if (_type != x->_type)
|
283 david.dillard 1.43 return false;
|
284 mike 1.13
285 if (!_qualifiers.identical(x->_qualifiers))
|
286 david.dillard 1.43 return false;
|
287 mike 1.13
288 if (_parameters.size() != x->_parameters.size())
|
289 david.dillard 1.43 return false;
|
290 mike 1.13
291 for (Uint32 i = 0, n = _parameters.size(); i < n; i++)
292 {
|
293 david.dillard 1.43 if (!_parameters[i].identical(x->_parameters[i]))
294 return false;
|
295 mike 1.13 }
296
297 return true;
298 }
299
300 void CIMMethodRep::setType(CIMType type)
301 {
302 _type = type;
303 }
304
305 PEGASUS_NAMESPACE_END
|