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